Tomcat Jersey部署Ubuntu服务器报NoSuchMethodError求助
这个javax.ws.rs.core.Application.getProperties()的NoSuchMethodError我之前踩过一模一样的坑,核心原因就是JAX-RS API版本和Jersey 2.x不兼容,或者服务器环境里存在冲突的依赖jar。下面给你一步步的解决思路:
核心问题分析
getProperties()是JAX-RS 2.0规范才新增的方法,而你的报错说明当前类加载环境里加载的是JAX-RS 1.x版本的Application类,和依赖JAX-RS 2.x的Jersey 2.x不匹配。这种冲突通常来自两个地方:项目依赖的jar,或者Tomcat服务器自带的jar。
具体解决方案
1. 清理项目依赖,确保JAX-RS API版本正确
如果用Maven管理依赖,检查你的pom.xml,确保只引入JAX-RS 2.x的API,并且和Jersey版本匹配:
<!-- Jersey核心依赖 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.30.1</version> <!-- 替换成你实际用的Jersey版本 --> </dependency> <!-- JAX-RS 2.x API,和Jersey版本兼容 --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> <!-- 注意:如果Tomcat本身不自带JAX-RS API,就去掉<scope>provided</scope>;如果服务器有预装,加上避免冲突 --> <scope>provided</scope> </dependency>
如果是手动导入jar包,务必删除项目WEB-INF/lib里所有JAX-RS 1.x相关的jar(比如jsr311-api-xxx.jar),只保留javax.ws.rs-api-xxx.jar和Jersey 2.x的jar。
2. 检查Tomcat服务器的lib目录,移除冲突jar
Ubuntu上的Tomcat有时候会通过系统包预装一些额外的JAX-RS相关库,比如jaxrs-api.jar或者其他第三方JAX-RS实现的jar。你需要:
- 进入Tomcat的
lib目录(通常是/var/lib/tomcat9/lib) - 搜索所有包含
jaxrs或javax.ws.rs的jar文件 - 如果发现不是你项目里引入的Jersey相关jar,直接删除它们,避免类加载冲突
3. 替换Jhades,用更可靠的方式检查依赖冲突
Jhades对JDK 12的模块化类加载器支持不好,所以检测结果不可信。你可以换用这些方式:
- 如果用Maven,执行命令:
mvn dependency:tree -Dverbose,然后在输出里搜索javax.ws.rs,看是否有多个版本的依赖被引入 - 直接打开项目打包后的
war包,查看WEB-INF/lib目录,手动检查是否有重复或版本不兼容的JAX-RS相关jar
4. 修正web.xml里的小错误
你的web.xml里servlet名字打错了:jersey-serlvet应该是jersey-servlet(少了一个字母v)。虽然这不是当前500错误的直接原因,但纠正后可以避免后续可能出现的匹配问题:
<servlet> <servlet-name>jersey-servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- 其他配置不变 --> </servlet> <servlet-mapping> <servlet-name>jersey-servlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
验证步骤
- 重新打包项目,确保
WEB-INF/lib里只有正确版本的Jersey和JAX-RS API jar - 清空Tomcat的
work和temp目录,避免缓存旧类 - 部署新的war包到Ubuntu的Tomcat,启动服务器
- 访问
http://your-server-ip:8080/your-app-name/rest/hello,如果返回Hello Jersey就说明问题解决了
内容的提问来源于stack exchange,提问作者user3531864

