最近把以前封装的SpringBoot 2.x代码升级到3.x,发现Servlet相关的包的命名空间从javax改变为了 jakarta。SpringBoot为什么会做如此大的破坏性更新,看了下Spring Boot 3.0的更新日志,有一条更新日志是:从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的,不要混淆了这两个项目,两者没有任何关系。
什么是企业级规范
企业级开发规范(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。另外,在Jakarta 9.1版本中,也增加了对Java 11的支持,建议同时升级到Java 11。
总结
总的来说,Jakarta EE就是Java EE的新名词。本来大部分开发者来说,这个名称的变化本来不应该是一个很重要的问题。然后,由于Java商标的问题,导致了项目名称和包命名空间的修改,从而引入不兼容的更新。因此,升级Jakarta EE 9及之后版本,必须特别注意将所有javax
的引用都改为jakarta
,包括直接或间接依赖的部分,否则可能会出现难以排查的异常问题。