Quarkus依赖javax而非Jakarta的技术原因及切换方法问询
一、Quarkus仍依赖javax的技术原因
Quarkus早期基于Java EE生态构建,javax是当时Java EE标准的官方命名空间。Jakarta EE 9的核心变更就是将所有API的包名从javax.*迁移到jakarta.*,这是一次全量的包名替换操作,涉及框架内部核心代码、所有官方扩展、以及第三方生态的兼容性适配。
Quarkus作为面向生产的框架,必须兼顾现有用户的稳定性需求——大量企业项目和第三方库仍基于javax栈运行,直接切换到Jakarta会导致这些用户无法平滑升级。因此Quarkus采取了分阶段迁移策略:2.x版本同时兼容javax和Jakarta,3.x版本则全面切换到Jakarta命名空间,完成了生态的整体过渡。
二、文档与代码仓库不一致的原因
这种情况是因为Quarkus的文档和快速启动项目的更新节奏不完全同步。部分文档提前跟进了Jakarta的技术标准进行表述,但对应的快速启动代码可能仍保留javax版本以兼容更多低版本用户,或者处于版本分支的维护阶段。你可以查看Quarkus最新的3.x版本分支下的示例代码,大部分已经完成了Jakarta命名空间的切换。
三、切换到Jakarta命名空间的方法
1. 新项目直接使用Jakarta栈
直接创建Quarkus 3.x及以上版本的项目,默认就会采用Jakarta命名空间,所有核心API(如JPA、CDI、Servlet等)都使用jakarta.*包名。
2. 现有javax项目升级到Jakarta
可以通过以下步骤完成迁移:
- 升级Quarkus版本到3.x及以上
- 替换项目依赖:将所有
javax.*相关的依赖替换为对应的jakarta.*依赖(例如javax.persistence:javax.persistence-api替换为jakarta.persistence:jakarta.persistence-api) - 批量替换代码中的包名:把所有
import javax.xxx修改为import jakarta.xxx - 检查并更新扩展依赖:确保使用的Quarkus官方扩展或第三方扩展已经适配Jakarta(大部分官方扩展在3.x版本中已完成适配)
3. 处理第三方Jakarta库的冲突
如果在javax版本的Quarkus项目中引入了使用Jakarta命名空间的第三方库,会出现包冲突问题。最稳妥的解决方式是直接升级项目到Quarkus 3.x版本;如果暂时无法升级,尝试通过依赖排除规则移除项目中的javax相关依赖,强制使用Jakarta版本,但这种方式容易引发兼容性问题,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者JeanValjean

