导言
最近看Spring Boot 3.0的代码,发现Servlet相关的包的命名空间从javax改变为了jakarta。这可是一个非常大的破坏性更新,看了下Spring 3.0的更新日志,有一条更新日志是:从JavaEE迁移到Jakarta EE。为什么要做这种破坏性的迁移呢?JavaEE怎么了?Jakarta EE又是什么?
什么是Jakarta EE
简单来说,Jakarta EE就是Java EE的新名词。这里的EE全称是Enterprise Edition,它是专门为企业级Java应用定义的一套规范,与Java SE(Java Platform, Standard Edition)相对应。
JavaEE是从Java 1.2版本开始推出的Java企业级开发平台,最初的名称是J2EE(Java 2 Platform, Enterprise Edition)。 随着Java的发展,它的名称于Java1.5版本时更改为Java EE(Java Platform, Enterprise Edition)。2009年Oracle收购了Sun,JavaEE开始由Oracle通过JCP(Java Community Process)开发和维护。
直到2017年,Oracle将JavaEE提交给了Eclipse基金会,并命名为Eclipse Enterprise for Java。然而,由于“Java”这个名字的商标归Oracle所有,Eclipse基金会无法继续使用javax.*和java.*,因此,项目名称改为Jakarta EE。值得一提的是,Jakarta(雅加达)是Java岛(爪洼岛)上最大的城市,也是印度尼西亚的首都。Apache软件基金会孵化的项目也有名称为Jakarta的,不要混淆了这两个项目,两者没有任何关系。
而作为JavaEE的后继者,Jakarta EE在JavaEE的基础上,专注于推进云原生Java应用的相关规范。随着云原生技术的发展和普及,企业对于构建高度可扩展、弹性伸缩的云原生应用的需求也在不断增长。Jakarta EE在这个背景下,提供了更多支持云原生开发的规范和功能,以满足企业在云环境中的需求,促进Java应用在云原生时代的发展。
那么,企业级开发规范具体是指什么呢?跟我们平时开发的Java程序有什么区别?
什么是企业级规范
企业级开发规范(Enterprise Edition)是针对大型企业级Java应用而设计的一套标准规范。相对于Java SE,Jakarta EE提供了更多的功能和组件,用于开发复杂的分布式、可扩展的企业级应用以及云原生Java应用。这么说还是比较抽象,其实Java开发经常接触到的Servlet,JSP,EJB,JMS就是其中的规范。这么说还是比较抽象,其实Java开发经常接触到的Servlet,JSP,EJB,JMS就是其中的规范。
Jakarta EE包含了许多技术规范和API,涵盖了Web应用、数据库访问、消息传递、事务处理、安全性等方面的功能,其中包括但不限于下列规范:
- Jakarta Servlet:前身是J2EE Servlet,定义了如何管理HTTP请求的规范。这应该是大部分Java Web开发者最熟悉的,同时也是许多其它规范的基础。
- Jakarta Server Page(JSP) :服务端动态生态生成网页的技术,可以看作Java版本的PHP和ASP。
- Jakarta Websocket:定义了一套WebSocket连接相关的API,用于实现全双工通信。
- Jakarta RESTful Web Services:开发符合REST原则的Web服务的一套规范。
- Jakarta JSON Binding:Java类和JSON字符串互相转换的规范。
- Jakarta XML Binding:Java类和XML的映射规范。
- Jakarta Enterprise Beans(EJB) :这个规范比较复杂,包括EJB容器,RMI(远程过程调用),并发控制,依赖注入等。
- Jakarta Persistent(JAP) :ORM规范,定义了Java类和数据库表直接的映射规范。
- Jakarta Transactions(JTA) :包含了事务相关的接口和注解类,也用于管理分布式事务。
- Jakarta Messaging(JMS) :消息系统的规范,用于实现异步消息传递,比如Apache的ActiveMQ就实现了这套规范。
- Validation:提供了接口和注解类,用于声明式地校验Bean,确保数据的合法性。
要部署Jakarta EE应用,就需要实现了Jakarta EE规范的服务器,比如Eclipse的GlassFish,IBM的WebSphere Liberty,Red Hat的WildFly等。
值得注意的是,Spring Boot广泛使用的Undertow,Tomcat和Jetty都不是Jakart EE服务器,它们只是Web服务器。Jakarta EE是一套相对重量级的规范和框架,而Spring提供了一套更轻量级的开发框架,目前被大部分互联网企业广泛采用。不过Spring很多项目都会尽量遵守这些规范,你在Spring的文档中也会经常接触到这些规范名称,比如Servlet,JAP等。
要不要升级到Jakarta EE
Jakarta EE 9之前的版本完全兼容J2EE,而Jakarta EE 9版本将API的命名空间从javax改成了jakarta,功能上没有多大变化。
如果要升级到Jakarta EE 9,一定要确保直接或者间接依赖的包都有兼容Jakarta EE 9的版本,也就是说对javax包的引用都要改成jakarta。Spring Boot 3.0和Spring 6系列都以及升级到了Jakarta EE 9,因此升级了Spring Boot和Spring也就相当于要升级到Jakarta EE 9。这也是升级到Spring Boot 3的一个最大的障碍。另外,在Jakarta 9.1版本中,也增加了对Java 11的支持,建议同时升级到Java 11。
至于目前最新版的Jakarta EE 10,它引入了许多变化,废弃和删除了一些规范,并引入了新功能。该版本面向Java 11,也支持LTS版本Java 17。然而,Jakarta EE 10的使用还不是很广泛,Spring也还没升级,只是做好了升级准备,目前不建议立刻升级。
总结
总的来说,Jakarta EE就是Java EE的新名词。本来大部分开发者来说,这个名称的变化本来不应该是一个很重要的问题。然后,由于Java商标的问题,导致了项目名称和包命名空间的修改,从而引入不兼容的更新。因此,升级Jakarta EE 9及之后版本,必须特别注意将所有javax的引用都改为jakarta,包括直接或间接依赖的部分,否则可能会出现难以排查的异常问题。
在升级Spring Boot 3.0之前,尤其要充分考虑这一点,确保所有相关依赖和代码都适配了Jakarta EE的新命名空间,以避免潜在的兼容性问题。这是升级到Spring Boot 3.0的一个重要考虑因素,需要在升级之前对项目的依赖和代码做充分的准备和调整。