迁移至Jersey 3.0.8时javax与jakarta依赖冲突问题求助
Jersey 3.0.8迁移(嵌入式Tomcat+Gradle)问题解决思路
核心原则:彻底切换到Jakarta EE生态,禁止混合javax/jakarta依赖
Jersey 3.x基于Jakarta EE 9+规范,必须完全抛弃javax命名空间的Servlet、JAX-RS等依赖,否则必然出现类加载冲突或上下文找不到的问题。
1. 调整嵌入式Tomcat依赖至Jakarta兼容版本
旧版Tomcat(9及以下)依赖javax.servlet,而Tomcat 10+才支持jakarta.servlet。你当前用了jakarta.servlet-api:6.0.0,需匹配Tomcat 10.1.x版本:
// 移除所有javax.servlet相关依赖,包括javax.servlet-api // 引入Jakarta版嵌入式Tomcat implementation("org.apache.tomcat.embed:tomcat-embed-core:10.1.10") implementation("org.apache.tomcat.embed:tomcat-embed-webapp:10.1.10") // 若用到WebApp相关功能 implementation("org.apache.tomcat.embed:tomcat-embed-jasper:10.1.10") // 若用到JSP
2. 统一Jersey依赖为Jakarta版本
确保所有Jersey组件都是Jakarta适配版,避免残留javax版依赖:
// 替换旧的javax版Jersey依赖,比如jersey-container-servlet -> jersey-container-servlet-jakarta implementation("org.glassfish.jersey.containers:jersey-container-servlet-jakarta:3.0.8") implementation("org.glassfish.jersey.core:jersey-server:3.0.8") implementation("org.glassfish.jersey.core:jersey-client:3.0.8") // 若用到CDI/依赖注入,补充Jakarta Inject API implementation("jakarta.inject:jakarta.inject-api:2.0.1")
3. 代码层面彻底替换命名空间
- 除
javax.imageio外,所有javax.servlet.*、javax.ws.rs.*、javax.inject.*等导入全部替换为jakarta.xxx - 检查配置类:确保继承
jakarta.ws.rs.core.Application而非旧版javax.ws.rs.core.Application - 检查Servlet相关代码:比如
ServletContext要改为jakarta.servlet.ServletContext,HttpServlet改为jakarta.servlet.http.HttpServlet等
4. 排查第三方依赖的javax残留
用Gradle命令查看依赖树,找出偷偷引入javax.servlet的第三方库:
./gradlew dependencies --configuration compileClasspath | grep javax.servlet
对这类库,要么替换为Jakarta兼容版本,要么通过exclude排除其javax依赖:
implementation("your-third-party-lib") { exclude group: 'javax.servlet', module: 'javax.servlet-api' }
5. 清理缓存并验证构建
执行以下命令清理Gradle缓存,确保无旧依赖残留:
./gradlew clean build --refresh-dependencies
6. 解决jakarta.inject.Singleton上下文问题
若仍出现该异常,需确保Jersey配置中启用了依赖注入支持:
- 在你的
ResourceConfig实现类中,注册Jersey的DI相关提供者:
public class AppConfig extends ResourceConfig { public AppConfig() { packages("your.resource.package"); // 注册DI支持 register(org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory.class); } }
内容的提问来源于stack exchange,提问作者buzoherbert
相关产品推荐
相关产品推荐

