Jakarta与javax JAXB包能否在同一项目中共存?求可行方案
新旧XML绑定API共存问题解答
一、能否在类路径中共存?
可以共存。javax.xml.bind(旧版)和jakarta.xml.bind(新版)属于不同的包名空间,本身不会在类路径中直接冲突,但需要搭配正确的API和运行时依赖,才能让两个依赖库都正常工作。
二、可行的依赖配置方案
你需要同时引入旧版API、新版API,以及兼容两者的运行时实现,示例配置如下:
<!-- 旧版JAXB API,供依赖javax.xml.bind的库A使用 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- 新版Jakarta XML Bind API,供依赖jakarta.xml.bind的库B使用 --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <!-- 新版运行时实现,同时兼容旧版API调用 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.4</version> </dependency> <!-- 可选:添加迁移桥,增强旧版API到新版实现的兼容性 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-jakarta-migration</artifactId> <version>4.0.4</version> </dependency>
说明:新版的jaxb-runtime(3.0及以上版本)内置了对旧版javax.xml.bind包的兼容桥接,能自动处理库A的旧API调用,同时满足库B对新版API的需求。
三、阴影(Shading)是不是唯一解决方案?
不是唯一方案。除了shading,还有以下几种可行方案:
- 类加载隔离:借助Java模块系统(JPMS),将库A与旧版JAXB封装到一个模块,库B与新版JAXB封装到另一个模块,通过模块路径实现类加载隔离,避免类冲突。
- 迁移桥适配:利用上述提到的Jakarta迁移桥,无需修改业务代码,让旧版API调用自动转发到新版运行时实现。
- 依赖范围调整:如果库A仅为编译期依赖,可尝试仅保留新版API和运行时,依赖新版运行时的兼容能力支撑旧API调用(需充分测试兼容性)。
不过shading是最彻底的方案——通过重新打包其中一个版本的JAXB类到自定义包名,完全隔离两个版本的依赖,适用于其他方案无法解决兼容性问题的场景。
内容的提问来源于stack exchange,提问作者kms333
相关产品推荐
相关产品推荐

