MyEclipse CI 10开发的Jersey服务部署Tomcat 8.5后调用报错求助
解决MyEclipse CI 10开发的Jersey服务部署到Tomcat 8.5后调用失败的问题
从你给出的代码片段能看出来,你用的是Jersey 1.x(com.sun.jersey包是旧版Jersey的标志),这种IDE内运行正常、部署到独立Tomcat就出问题的情况,大多是环境差异导致的,我给你梳理几个最可能的原因和解决办法:
1. 先确认Tomcat里的Jersey依赖有没有配齐
MyEclipse会自动帮你把项目依赖的Jersey包加到运行环境里,但独立Tomcat可没这“贴心”功能。你得自己确保:
- 项目的
WEB-INF/lib目录下,必须有Jersey 1.x的核心包:jersey-core.jarjersey-server.jarjersey-servlet.jarjsr311-api.jar
- 要是你用Maven管理依赖,记得把这些包的
<scope>设为compile(别用provided,除非你手动把包放到Tomcat全局lib里了,不推荐这么做)
2. 检查web.xml的Jersey Servlet配置是否正确
Jersey 1.x需要在web.xml里配置它的核心Servlet,IDE可能帮你自动生成了,但部署时得确认配置没问题:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>logic</param-value> <!-- 这里填你的服务类所在的包,就是你代码里的package logic; --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> <!-- 这个路径要和你的@Path配合,比如你的类上@Path("test"),那访问地址就是http://localhost:8080/你的项目名/rest/test --> </servlet-mapping>
要是你用了Servlet 3.0+的注解式配置(比如@ApplicationPath),要确保Tomcat 8.5支持,而且别和web.xml的配置冲突。
3. 排查版本兼容性问题
Tomcat 8.5用的是Servlet 3.1规范,而有些旧版本的Jersey 1.x对Servlet 3.1的支持不太好。建议:
- 把Jersey升级到1.x的最新稳定版(比如1.19.4),这个版本对Servlet 3.1的兼容性更完善
- 别同时在Tomcat的全局
lib和项目WEB-INF/lib里放Jersey包,会导致类加载冲突,出现各种奇怪的错误
4. 看Tomcat日志找具体错误
要是上面的步骤都没用,一定要去看Tomcat的日志文件(logs/catalina.out或者localhost.log),日志里的异常信息能直接帮你定位问题:
- 要是看到
ClassNotFoundException,就是依赖包没配齐 - 要是
NoClassDefFoundError,大概率是依赖冲突或者版本不匹配 - 要是访问时返回404,那基本是路径映射配置错了
最后给个小建议:用MyEclipse的“Export WAR”功能打包,确保所有依赖都被打进war包,然后把war包放到Tomcat的webapps目录下,重启Tomcat再测试。
内容的提问来源于stack exchange,提问作者Omar Barrera Valentin
相关产品推荐
相关产品推荐

