依赖未适配Jakarta的第三方库时,如何迁移至Spring Boot 3?
解决方案
1. 优先使用JAX-RS迁移桥接(推荐)
Spring Boot 3 基于 Jakarta EE 10,JAX-RS 3.0已迁移至jakarta.ws.rs包。针对依赖javax.ws.rs的第三方库,可通过桥接依赖将javax.ws.rs的调用转发到jakarta.ws.rs的实现:
- Maven配置(
pom.xml):
<!-- Jersey兼容层,处理javax到jakarta的类映射 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>3.1.5</version> </dependency> <!-- 提供javax.ws.rs API的桥接声明 --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> <scope>provided</scope> </dependency>
- Gradle配置:
implementation 'org.glassfish.jersey.core:jersey-common:3.1.5' provided 'javax.ws.rs:javax.ws.rs-api:2.1.1'
该方案复用Spring Boot 3已有的Jakarta实现,避免引入两套独立的API实现。
2. 临时引入javax API依赖(应急可用)
若桥接方案不生效,可临时引入javax.ws.rs的API包,但需严格控制:
- 仅引入API依赖(如
javax.ws.rs:javax.ws.rs-api:2.1.1),不要引入完整的jersey-client实现,防止和Spring Boot 3的Jakarta版Jersey冲突 - 项目代码必须严格区分
jakarta.*和javax.*包,禁止混用
3. 等待第三方库适配(备选)
若项目进度允许,可关注jira-rest-java-client-core的版本更新,等待官方推出Jakarta兼容版本。但此方案存在适配时间不确定的风险,可能阻塞迁移进度。
关于类路径共存jakarta和javax的问题
- 不同包名的API(
javax.*vsjakarta.*)本身不会触发类冲突,JVM会将其视为完全独立的类。 - 风险点在于实现类冲突:若同时引入
javax.ws.rs和jakarta.ws.rs的实现库(如旧版Jersey和新版Jersey),可能出现NoClassDefFoundError、ClassCastException等类加载异常。 - 因此,应尽量避免同时引入两套实现,优先采用桥接方案复用Jakarta的实现。
内容的提问来源于stack exchange,提问作者theo
相关产品推荐
相关产品推荐

