導言
最近看Spring Boot 3.0的代碼,發(fā)現(xiàn)Servlet相關的包的命名空間從JAVAx改變?yōu)榱薺akarta。這可是一個非常大的破壞性更新,看了下Spring 3.0的更新日志,有一條更新日志是:從JavaEE遷移到Jakarta EE。為什么要做這種破壞性的遷移呢?JavaEE怎么了?Jakarta EE又是什么?
什么是Jakarta EE
簡單來說,Jakarta EE就是Java EE的新名詞。這里的EE全稱是Enterprise Edition,它是專門為企業(yè)級Java應用定義的一套規(guī)范,與Java SE(Java Platform, Standard Edition)相對應。
JavaEE是從Java 1.2版本開始推出的Java企業(yè)級開發(fā)平臺,最初的名稱是J2EE(Java 2 Platform, Enterprise Edition)。 隨著Java的發(fā)展,它的名稱于Java1.5版本時更改為Java EE(Java Platform, Enterprise Edition)。2009年Oracle收購了Sun,JavaEE開始由Oracle通過JCP(Java Community Process)開發(fā)和維護。
直到2017年,Oracle將JavaEE提交給了Eclipse基金會,并命名為Eclipse Enterprise for Java。然而,由于“Java”這個名字的商標歸Oracle所有,Eclipse基金會無法繼續(xù)使用javax.*和java.*,因此,項目名稱改為Jakarta EE。值得一提的是,Jakarta(雅加達)是Java島(爪洼島)上最大的城市,也是印度尼西亞的首都。Apache軟件基金會孵化的項目也有名稱為Jakarta的,不要混淆了這兩個項目,兩者沒有任何關系。
而作為JavaEE的后繼者,Jakarta EE在JavaEE的基礎上,專注于推進云原生Java應用的相關規(guī)范。隨著云原生技術的發(fā)展和普及,企業(yè)對于構建高度可擴展、彈性伸縮的云原生應用的需求也在不斷增長。Jakarta EE在這個背景下,提供了更多支持云原生開發(fā)的規(guī)范和功能,以滿足企業(yè)在云環(huán)境中的需求,促進Java應用在云原生時代的發(fā)展。
那么,企業(yè)級開發(fā)規(guī)范具體是指什么呢?跟我們平時開發(fā)的Java程序有什么區(qū)別?
什么是企業(yè)級規(guī)范
企業(yè)級開發(fā)規(guī)范(Enterprise Edition)是針對大型企業(yè)級Java應用而設計的一套標準規(guī)范。相對于Java SE,Jakarta EE提供了更多的功能和組件,用于開發(fā)復雜的分布式、可擴展的企業(yè)級應用以及云原生Java應用。這么說還是比較抽象,其實Java開發(fā)經常接觸到的Servlet,JSP,EJB,JMS就是其中的規(guī)范。這么說還是比較抽象,其實Java開發(fā)經常接觸到的Servlet,JSP,EJB,JMS就是其中的規(guī)范。
Jakarta EE包含了許多技術規(guī)范和API,涵蓋了Web應用、數(shù)據(jù)庫訪問、消息傳遞、事務處理、安全性等方面的功能,其中包括但不限于下列規(guī)范:
- Jakarta Servlet:前身是J2EE Servlet,定義了如何管理HTTP請求的規(guī)范。這應該是大部分Java Web開發(fā)者最熟悉的,同時也是許多其它規(guī)范的基礎。
- Jakarta Server Page(JSP) :服務端動態(tài)生態(tài)生成網頁的技術,可以看作Java版本的php和ASP。
- Jakarta Websocket:定義了一套WebSocket連接相關的API,用于實現(xiàn)全雙工通信。
- Jakarta RESTful Web Services:開發(fā)符合REST原則的Web服務的一套規(guī)范。
- Jakarta JSON Binding:Java類和JSON字符串互相轉換的規(guī)范。
- Jakarta XML Binding:Java類和XML的映射規(guī)范。
- Jakarta Enterprise Beans(EJB) :這個規(guī)范比較復雜,包括EJB容器,RMI(遠程過程調用),并發(fā)控制,依賴注入等。
- Jakarta Persistent(JAP) :ORM規(guī)范,定義了Java類和數(shù)據(jù)庫表直接的映射規(guī)范。
- Jakarta Transactions(JTA) :包含了事務相關的接口和注解類,也用于管理分布式事務。
- Jakarta Messaging(JMS) :消息系統(tǒng)的規(guī)范,用于實現(xiàn)異步消息傳遞,比如Apache的ActiveMQ就實現(xiàn)了這套規(guī)范。
- Validation:提供了接口和注解類,用于聲明式地校驗Bean,確保數(shù)據(jù)的合法性。
要部署Jakarta EE應用,就需要實現(xiàn)了Jakarta EE規(guī)范的服務器,比如Eclipse的GlassFish,IBM的WebSphere Liberty,Red Hat的WildFly等。
值得注意的是,Spring Boot廣泛使用的Undertow,Tomcat和Jetty都不是Jakart EE服務器,它們只是Web服務器。Jakarta EE是一套相對重量級的規(guī)范和框架,而Spring提供了一套更輕量級的開發(fā)框架,目前被大部分互聯(lián)網企業(yè)廣泛采用。不過Spring很多項目都會盡量遵守這些規(guī)范,你在Spring的文檔中也會經常接觸到這些規(guī)范名稱,比如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,它引入了許多變化,廢棄和刪除了一些規(guī)范,并引入了新功能。該版本面向Java 11,也支持LTS版本Java 17。然而,Jakarta EE 10的使用還不是很廣泛,Spring也還沒升級,只是做好了升級準備,目前不建議立刻升級。
總結
總的來說,Jakarta EE就是Java EE的新名詞。本來大部分開發(fā)者來說,這個名稱的變化本來不應該是一個很重要的問題。然后,由于Java商標的問題,導致了項目名稱和包命名空間的修改,從而引入不兼容的更新。因此,升級Jakarta EE 9及之后版本,必須特別注意將所有javax的引用都改為jakarta,包括直接或間接依賴的部分,否則可能會出現(xiàn)難以排查的異常問題。
在升級Spring Boot 3.0之前,尤其要充分考慮這一點,確保所有相關依賴和代碼都適配了Jakarta EE的新命名空間,以避免潛在的兼容性問題。這是升級到Spring Boot 3.0的一個重要考慮因素,需要在升級之前對項目的依賴和代碼做充分的準備和調整。