Tomcat10部署Jersey项目报Servlet load()异常及HTTP404如何解决
问题根因
- 你当前使用的Jersey 1.19.1属于基于JavaEE规范的旧版本,所有依赖使用
javax.*命名空间包名,而Tomcat 10及以上版本已全面切换至JakartaEE规范,内置Servlet API包名为jakarta.*,两者完全不兼容,直接导致Jersey Servlet初始化加载失败抛出load()异常,接口资源无法正常注册,最终访问返回404,错误提示如下:
源服务器未找到目标资源的当前表示,或不愿意披露该资源的存在。
- 你提供的代码实际是项目的
pom.xml配置文件,并非你描述的web.xml。 - 当前pom中maven编译插件指定的JDK版本为1.6,版本过旧,与当前主流服务器兼容性差。
解决方案
方案一(操作成本最低):降级Tomcat版本
直接将运行环境更换为Tomcat 9.x及更低版本,Tomcat 9仍支持javax.*命名空间,无需大范围修改项目代码和配置,仅需调整pom中maven编译插件的source和target版本为1.8及以上即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <inherited>true</inherited> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
修改后重新打包部署即可正常运行。
方案二(保留Tomcat 10):升级项目依赖适配JakartaEE
需要全量替换项目相关依赖适配新规范:
- 移除所有
com.sun.jersey相关依赖,替换为Jersey 3.x及以上版本(适配JakartaEE),对应groupId更换为org.glassfish.jersey - 移除
javax.servlet-api依赖,替换为对应版本的jakarta.servlet-api - 同步修改web.xml中Jersey Servlet的全类名、项目代码中所有
javax.ws.rs.*导入语句为jakarta.ws.rs.* - 调整maven编译插件的JDK版本为1.8及以上
修改完成后重新打包部署即可正常运行。
内容的提问来源于stack exchange,提问作者Apoorva Basavaradder
相关产品推荐
相关产品推荐

