排查jsr311-api-1.1.1依赖归属及解决NoSuchMethodError异常
问题分析与解决方案
一、哪些依赖需要引入jsr311-api-1.1.1?
jsr311-api-1.1.1是JAX-RS 1.1规范的API包,主要是基于JAX-RS 1.x的REST框架实现会依赖它:
- 比如早期版本的Jersey(1.x系列,比如Jersey 1.19.4),它的核心依赖会间接引入这个API包;
- 如果你在开发基于JAX-RS 1.1规范的REST服务,也需要手动把它作为编译依赖引入,确保代码能调用JAX-RS 1.1的接口。
二、解决java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()报错
这个报错的核心原因是JAX-RS API版本冲突:
getProperties()方法是JAX-RS 2.0规范才新增的接口方法,对应的API包是javax.ws.rs-api(版本2.0及以上);- 但你的项目里同时存在JAX-RS 1.1的API(
jsr311-api-1.1.1)和JAX-RS 2.x的实现(比如Jersey 2.x),运行时JVM加载了旧的API类,导致找不到新方法。
具体解决步骤:
排查依赖冲突
- 用Maven执行命令:
mvn dependency:tree,或者Gradle执行:gradle dependencies,查看依赖树里是否同时存在jsr311-api(1.1.1版本)和javax.ws.rs-api(2.x版本)。
- 用Maven执行命令:
统一JAX-RS版本
- 如果你的项目用的是Jersey 2.x或其他JAX-RS 2.x实现:
移除jsr311-api-1.1.1依赖,改用JAX-RS 2.x的API包,比如:<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0.1</version> </dependency> - 如果必须使用JAX-RS 1.1规范:
把REST框架版本降到1.x(比如Jersey 1.19.4),它会自动依赖jsr311-api-1.1.1,避免版本不兼容。
- 如果你的项目用的是Jersey 2.x或其他JAX-RS 2.x实现:
排除间接引入的冲突依赖
如果是某个第三方依赖间接引入了jsr311-api-1.1.1,可以在Maven里通过排除规则移除它:<dependency> <groupId>第三方依赖的groupId</groupId> <artifactId>第三方依赖的artifactId</artifactId> <version>对应版本号</version> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

