使用Jersey 2.26遭遇javax.ws.rs.core.UriBuilder抽象方法错误求助
解决Jersey 2.26下的
java.lang.AbstractMethodError: UriBuilder.uri()错误 这个错误本质上是JAX-RS API接口与Jersey实现版本不兼容,或者项目中混入了其他冲突的JAX-RS相关依赖导致的——简单说就是JVM加载了一个没有实现UriBuilder.uri(String)方法的旧版API类,而Jersey 2.26的实现是基于新版API的,自然就报错了。
虽然你用的是Jersey 2.26(理论上这个版本已经适配了对应的JAX-RS API),但结合你的pom.xml片段,我给你几个具体的排查和解决步骤:
1. 先排查依赖树,找冲突根源
首先执行Maven命令生成完整的依赖树,这是定位冲突最直接的方式:
mvn dependency:tree > dependency-tree.txt
打开生成的dependency-tree.txt,重点搜索以下内容:
- 任何
javax.ws.rs:javax.ws.rs-api的依赖,如果版本低于2.1(Jersey 2.26对应的JAX-RS API版本是2.1),说明有旧版API冲突 - 任何
com.sun.jersey开头的依赖(这是Jersey 1.x的包,和2.x完全不兼容) - 其他JAX-RS实现的依赖,比如
org.jboss.resteasy开头的包
2. 检查Metrics依赖是否引入了旧Jersey包
你用到的com.yammer.metrics:metrics-servlet:2.1.2是比较老的版本,它可能依赖了Jersey 1.x的包。如果在依赖树里发现了com.sun.jersey相关的依赖,直接在Metrics的依赖里排除它们:
<dependency> <groupId>com.yammer.metrics</groupId> <artifactId>metrics-servlet</artifactId> <version>2.1.2</version> <exclusions> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> </exclusion> </exclusions> </dependency>
3. 确保Jersey核心依赖版本统一且完整
你目前只贴了jersey-container-servlet-core,但Jersey 2.x的核心依赖需要版本统一,建议检查是否引入了以下核心包(版本全部为2.26):
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.26</version> </dependency>
如果有其他Jersey相关依赖,必须保证版本和2.26一致,不能混合不同版本的Jersey包。
4. 排查容器类加载问题
如果是部署在Tomcat、Jetty等容器中,容器本身可能自带了JAX-RS相关的API包,导致优先加载了旧版类。解决方式:
- 打包成Fat War:把所有Jersey和JAX-RS依赖都打包到war包中,避免容器加载自带的旧类
- 配置容器类加载优先级:比如在Tomcat的
context.xml中设置<Loader delegate="false"/>,让Web应用优先加载自己的依赖
按照这几步排查,应该能找到导致冲突的依赖并解决问题。
内容的提问来源于stack exchange,提问作者Ritesh
相关产品推荐
相关产品推荐

