JAX-RS WebApp部署Tomcat遇404错误(Eclipse运行正常)
排查WAR包部署后CXF JAX-RS 404问题的步骤
针对你遇到的Eclipse内运行正常、独立WAR包部署Tomcat后404的问题,按以下步骤排查:
核对WAR包目录与依赖完整性
- 解压WAR包,检查
WEB-INF/lib下是否包含所有CXF核心依赖:cxf-core.jar、cxf-rt-frontend-jaxrs.jar、javax.ws.rs-api.jar等,确保和Eclipse部署时的依赖完全一致——手动打包或Maven/Gradle配置错误常导致依赖遗漏。 - 检查
WEB-INF/web.xml的CXF Servlet配置:- 确认servlet类为
org.apache.cxf.transport.servlet.CXFServlet(旧版CXF的javax包实现,不要用Jakarta版本) - 确认
url-pattern设置为/eshop/*,与你的请求路径前缀匹配
- 确认servlet类为
- 验证JAX-RS应用类配置:
- 如果用
@ApplicationPath("/eshop")注解,确保该注解在打包后的class文件中正常生效 - 如果是web.xml中通过
context-param指定应用类,检查参数名javax.ws.rs.Application对应的类路径是否正确
- 如果用
- 解压WAR包,检查
确认Tomcat部署上下文路径
查看Tomcatwebapps目录下解压后的应用文件夹名,若WAR包名为es4.3.war,正常上下文路径应为/es4.3,但部分旧版Tomcat会自动替换点为下划线(变为/es4_3),导致请求路径错误。可通过Tomcat管理控制台确认实际部署的上下文路径。查看CXF初始化日志
打开Tomcat的logs/catalina.out或localhost.log,搜索CXF相关日志:- 若未找到
Deploying JAX-RS root resource class相关输出,说明CXF未成功扫描到你的服务类 - 若出现ClassNotFound或NoClassDefError,说明存在依赖缺失或版本冲突
- 若未找到
核对版本兼容性
因使用旧版Tomcat,必须确保CXF版本与Tomcat的Servlet API版本匹配:- Tomcat 7对应CXF 2.x系列,Tomcat 8对应CXF 3.x早期版本
- 所有依赖必须是
javax.*包(如javax.servlet、javax.ws.rs),禁止混入Jakarta命名空间的jar包
对比Eclipse部署文件与WAR包内容
将Eclipse自动部署到Tomcatwebapps/es4.3下的文件,与你打包的WAR解压文件逐一对比,重点检查:WEB-INF/classes下的class文件是否齐全(特别是服务实现类、应用类)WEB-INF/lib下的jar包是否完全一致
结合你提供的截图补充检查:
- 服务接口的
@Path注解是否正确(如类上的@Path与方法上的@Path组合后是否对应/eshop/items) - 应用类的
getClasses()方法是否正确返回了你的服务实现类的Class对象
内容的提问来源于stack exchange,提问作者CostaMH
相关产品推荐
相关产品推荐

