一、前言
很多Java程序员在使用新版本的Spring6或者springboot3版本的时候,发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候,也发展了大量jakarta的工程包。
比如:camunda的webapps编译工程就提供了2种方式javax和jakarta
* `assembly` - Java sources and tests for the Camunda web application based on `javax` namespace.* `assembly-jakarta` - Java sources and tests for the Camunda web application based on `jakarta` namespace.* This module is created from the `assembly` module via code transformation.
网上也有好多同学使用Tomcat时遇到到Jakarta.servlet与javax.servlet包冲突的问题。
Tomcat10中解决eclipse内部Jakarta.servlet与javax.servlet不兼容问题方法:
https://blog.csdn.net/mmmm0584/article/details/115161865
引起以上问题的原因是:Java EE更名为Jakarta EE,javax命名空间变为jakarta,javax包名前缀变为jakarta。
二、Java EE为什么更名Jakarta EE
2009年4月20日,甲骨文(Oracle)公司和Sun公司今天共同宣布了最终协议,甲骨文公司将以74亿美元收购SUN公司。当时,Sun Microsystems被誉为世界上最具前瞻性的IT公司之一,有能力以开放软件及硬件为结合,进行全面统一的系统,给客户带来最大的价值。Oracle收购Sun Microsystems表明,它希望借助Sun Microsystems的关键软件和技术资源,将自身现有的专业的管理体系,硬件解决方案,及应用程序发展技术集成在同一个平台上,从而创建一个更加完善的企业增值产品和服务。
2018年,Oracle(甲骨文)决定将Java EE移交给开源组织Eclipse基金会,但甲骨文不允许开源组织用Java的名号,于是Eclipse选出了 "Jakarta EE" 和"Enterprise Profile"两个名字,最终前者胜出。
Eclipse基金会高管Mike Milinkovich表示,7000多人参与了Java EE的更名投票,64%的票数支持改为Jakarta EE,另有35.6%的票数支持Enterprise Profile。
Oracle将Java EE(Java SE还自己保留)交给开源组织,Eclipse基金会接手。但Oracle不允许开源组织使用Java名号,所以Jakarta EE名称于2018.02.26应运而生。Oracle收购了Sun公司,涉及到商标和版权原因,Javax改名为Jakarta迫不得已。
从Java EE到Jakarta EE,企业版Java、JDK的发展历程,参考:
https://cloud.tencent.com/developer/article/1847110
三、Java EE更名Jakarta对软件影响
Spring Framework作为Java领域最为流行的框架,有非常庞大的用户群体和项目应用,Java开源框架里绝对的TOP1。我们首先看看Java EE更名Jakarta对Spring Framework的影响。
Spring Framework 6正式发布,携JDK 17&Jakarta EE开启新篇章,Spring Framework为何一跃将JDK的baseline从JDK 8提到JDK 17,以及废弃javax,启用全新的jakarta命名空间。Spring Framework 6基于JDK 17构建。换句话讲,若想使用Spring Framework 6那么你的JDK环境最低要求JDK 17。
javax命名空间其实早已成为过去式,毕竟现在已快2024年了。这次Spring团队也是跟着JDK一起,顺势的完全摒弃掉了javax命名空间,拥抱Jakarta EE。
另外,之前有些内置进JDK里面的Java EE注解,现在也换“包名”啦,如具有代表性的:JSR-330的@Inject、JSR 250的@PostConstruct、@Predestroy以及及其常用的@Resource注解,Resource包名变成了jakarta.annotation.Resource。
从Jakarta EE 9开始,便使用了全新的jakarta.*命名空间。本次建议使用从Jakarta EE 10起步。对应的技术主要有:
Jakarta Servlet 6.0
Jakarta Servlet JSP JSTL 3.0
Jakarta Validation 3.0
Jakarta WebSocket 2.1
Jakarta Persistence 3.1
Jakarta JMS 3.1
Jakarta JSON 2.1
Jakarta JSON Bind 3.0
Jakarta Activation 2.1
Jakarta Mail 2.1
Jakarta Transaction 2.0
Jakarta WS RS 3.1
Jakarta XML SOAP 3.0
Jakarta XML WS 4.0
比如:开发web程序最常用的servlet,从maven中央仓库检索,发现:
servlet4.0.1以前的版本是javax,从4.0.2版本以后均迁移到了jakarta
javax.servlet
javax.servlet-api
4.0.1
servlet-api从4.0.2版本—6.0.0版本均变成了jakarta.servlet-api
jakarta.servlet
jakarta.servlet-api
4.0.2
参考文章:https://fangshixiang.blog.csdn.net/article/details/128056207
四、Jakarta EE发展现状
打开Jakarta官方网站:https://jakarta.ee/
使用 ENTERPRISE JAVA 为云原生架构构建开源生态系统,最新版本:Jakarta EE 10 现已上市。
Jakarta EE 平台和配置文件规范是各个规范的总括规范。Jakarta EE 平台包括大多数单独的规范,而 Profile 规范包括用于开发 Web 平台和微服务架构的单个规范。
我们看看Jakarta的生态,包括 Fujitsu、IBM、Oracle、Red Hat 和 Tomittribe 在内的全球企业 Java 生态系统领导者正在共同努力,推动 Java EE 和 Jakarta EE 的发展,以支持将关键任务应用程序和工作负载迁移到云中。另外中国开发应用中间件的企业也在其中,包括普元、宝兰德、东方通、金蝶、华宇、亚信等公司。
未来Java项目升级JDK后,可能会涉及到到代码的升级,官方出了一篇文章:如何升级到 Jakarta EE 10 和 GlassFish 7 – 这比您想象的要容易得多。https://omnifish.ee/2023/05/06/how-to-upgrade-to-jakarta-ee-10-and-glassfish-7/
从旧版本的 Jakarta EE 或 Java EE 升级到 Jakarta EE 10 可能有点棘手,可能需要额外注意细节。您可能会遇到的主要事情之一是确保现有代码和库兼容。某些库可能仍在使用该软件包,这可能会导致在尝试在 Jakarta EE 服务器(如 Eclipse GlassFish 7)上运行应用程序时发生冲突。您可能还会遇到一些在 Jakarta EE 10 中删除的已弃用 API 的问题。javax
但别担心,我们已经为您准备好了!在这篇文章和本系列的未来文章中,我们将解释您需要了解的所有信息,以成功且几乎立即升级到 Jakarta EE 10。
升级到 Jakarta EE 10 或 GlassFish 7 的挑战分为以下 3 大类:
- 更改包前缀需要更新对旧包的所有引用javaxjakarta
- 过时的批注可能需要替换为替代批注
- 重写使用已删除 API 的代码,这些 API 没有直接的替代方案
以上所有内容不仅适用于您的代码库,也适用于您的应用程序使用的所有依赖项。许多流行的库已经有与 Jakarta EE 10 兼容的新版本,因此更新它们就足够了。但有些图书馆可能不支持 Jakarta EE 10,需要进行特殊调整。幸运的是,有一些工具可以在源代码级别和二进制(字节码)级别上自动执行此操作。
幸运的是,许多挑战都可以使用免费和开源工具(如 Openrewrite、WindUp 和 Eclipse Transformer)自动完成。Openrewrite 是一个强大的工具,可以自动更改应用程序的源代码,例如使用新前缀更新对旧包的所有引用。
以下是雅加达Jakarta 官方调查问卷的统计,雅加达Jakarta的应用情况。
Jakarta EE是用于构建云原生应用程序的顶级框架的基础。
雅加达Jakarta 构建云原生应用程序的EE使用率从2021年的47%增加到2022年的53%,而Spring/Spring Boot和MicroProfile的使用量有所下降。