Java EE 的現(xiàn)狀是怎樣的?
對(duì)于大多數(shù)企業(yè)來(lái)說(shuō),Java EE 仍然是一個(gè)非常有價(jià)值的平臺(tái):
完善而靈活的編程模型。
單一的依賴管理:通常一個(gè) Maven 的 pom.xml 不會(huì)包含超過(guò) 20 行配置代碼,即使項(xiàng)目很復(fù)雜。
CDI 易用且強(qiáng)大。
可以與大多數(shù) IDE 集成。
有很多輕量級(jí)的應(yīng)用服務(wù)器,比如 TomEE、Payara、Red Hat Wildfly 和 IBM Liberty,它們不僅啟動(dòng)速度快,而且占用資源小。
可以使用 Java EE 來(lái)開(kāi)發(fā)容器化的微服務(wù),雖然不完美,但也不失為一種選擇。
在我看來(lái),Java EE 的不足在于:
不夠先進(jìn):盡管它還有一定的價(jià)值,但大部分開(kāi)發(fā)者并不會(huì)將它作為開(kāi)發(fā)云原生應(yīng)用的首選。
因?yàn)榻M件模型的差異,缺乏整體的一致性:Servlet、CDI、EJB……確切點(diǎn)說(shuō),CDI 和 EJB 之間的界限有點(diǎn)模糊,或許 CDI 在未來(lái)會(huì)成為“第一類公民”。
測(cè)試相對(duì)復(fù)雜。
規(guī)范及其實(shí)現(xiàn)的演進(jìn)速度較慢。
與 Java SE 不同步:要想在 Java EE 中看到 Java 9 的模塊化系統(tǒng)尚需時(shí)日。
Java EE 生態(tài)系統(tǒng)的演化
Oracle 的決定給整個(gè) Java EE 生態(tài)系統(tǒng)帶來(lái)重大影響。
Oracle
作為 Java 技術(shù)(包括 Java EE)和品牌的所有者,Oracle 仍然會(huì)繼續(xù)負(fù)責(zé)維護(hù) Java EE 8。
但這種所有權(quán)在品牌和未來(lái)的技術(shù)發(fā)展方面存在一些限制,比如:
不能再使用 Java EE 作為品牌名稱。
在新名稱中使用 Java 要經(jīng)過(guò)多方討論和允許。
不能再使用 javax 包名。

JCP
JCP 旨在“為 Java 技術(shù)制定標(biāo)準(zhǔn)技術(shù)規(guī)范”。但 JCP 幾乎為 Oracle 所掌控:項(xiàng)目管理辦公室、選舉、投票、規(guī)范管理等等。從組織角度來(lái)看,JCP 是開(kāi)放的,它歡迎任何人加入,IBM 和 Red Hat 就是非常重要的成員。同時(shí),JCP 涵蓋了 Java EE 中的很多規(guī)范,如 Servlet、EJB、CDI、JAX-RS……
其中每個(gè)規(guī)范都是以 JSR(Java Specification Request)的形式進(jìn)行管理的(比如 Java EE 8 對(duì)應(yīng) JSR 266,Servlet 4.0 對(duì)應(yīng) JSR 369,CDI 2.0 對(duì)應(yīng) JSR 365,CDI 2.1 對(duì)應(yīng) JSR 370),并由專家組負(fù)責(zé)管理每個(gè)規(guī)范的生命周期。
專家組要交付三個(gè)方面的內(nèi)容,包括規(guī)范文檔、規(guī)范的參考實(shí)現(xiàn)以及測(cè)試套件。
從外部來(lái)看,這個(gè)流程太過(guò)笨重:從規(guī)范的啟動(dòng)到最終發(fā)布需要很長(zhǎng)時(shí)間,而應(yīng)用服務(wù)器實(shí)現(xiàn)規(guī)范也需要一些時(shí)間。
從內(nèi)部來(lái)看,作為 JCP 的成員,我不得不承認(rèn),JCP 的監(jiān)管質(zhì)量和人們的投入程度給我留下了深刻印象?;蛟S它的步子邁得不夠快,但話說(shuō)回來(lái),在制定一個(gè)標(biāo)準(zhǔn)時(shí),創(chuàng)新又占有多大比重呢?
EE4J 最為成功的一個(gè)方面在于它的敏捷性,它能夠很快建立起強(qiáng)壯且靈活的監(jiān)管模型。
Java EE Guardians
Java EE Guardians 由“一群致力于通過(guò)社區(qū)和擁護(hù)者來(lái)推動(dòng) Java EE 平臺(tái)發(fā)展的草根組成”。Reza Rahman 在 2015 年成立了 Java EE Guardians,旨在催促 Oracle 重啟 Java EE 8,因?yàn)楫?dāng)時(shí)的 Java EE 8 處于停滯狀態(tài)。
Microprofile.io
Microprofile 把自己定義成“一個(gè)基準(zhǔn)平臺(tái),以微服務(wù)架構(gòu)為基準(zhǔn)來(lái)優(yōu)化企業(yè)版 Java,并交付可在多個(gè) Microprofile 運(yùn)行時(shí)上運(yùn)行的應(yīng)用程序”。它從 2016 年夏天啟動(dòng),現(xiàn)在已經(jīng)成為了 Eclipse 的項(xiàng)目,最初貢獻(xiàn)者包括 TomiTribe、IBM 和 Payara,Oracle 也在 2017 年 11 月加入其中。
Microprofile 的第一個(gè)版本在 JavaOne 2016 上發(fā)布,涵蓋了 JAX-RS 2.0、CDI 1.2 和 JSON-P 1.0。
從那以后,社區(qū)同時(shí)開(kāi)始了多個(gè)項(xiàng)目,包括:
microprofile-config
microprofile-fault-tolerance
microprofile-health
microprofile-metrics
microprofile-open-api
microprofile-jwt-auth
Microprofile.io 的最初目標(biāo)是專注于 JCP 標(biāo)準(zhǔn)的快速創(chuàng)新,而現(xiàn)在也可以被認(rèn)為是 EE4J 在社區(qū)、組織和監(jiān)管方面的“POC(概念性驗(yàn)證)”。

Microprofile.io 的未來(lái)將去向何處?與 EE4J 合并抑或是繼續(xù)保持獨(dú)立?現(xiàn)在還沒(méi)有定論。
EE4J
EE4J 的章程上寫道:“Eclipse Enterprise for Java(EE4J)是一個(gè)開(kāi)源倡議,旨在建立和實(shí)現(xiàn)標(biāo)準(zhǔn) API,為 Java 運(yùn)行時(shí)提供技術(shù)工具,促進(jìn)服務(wù)器端和云原生應(yīng)用的開(kāi)發(fā)、部署和管理。EE4J 以 Java 平臺(tái)和 Java EE 標(biāo)準(zhǔn)為基礎(chǔ),并在 Java EE 8 的基準(zhǔn)上建立新的標(biāo)準(zhǔn)”。
需要注意的是,EE4J 只是項(xiàng)目的名稱,而不是一個(gè)品牌。2017 年 11 月份,他們?yōu)閷ふ液线m的品牌名稱進(jìn)行過(guò)一次問(wèn)卷。但因?yàn)槭艿缴鲜龅囊恍┫拗?,至今未達(dá)成共識(shí)。不過(guò),社區(qū)當(dāng)中有 79% 的人似乎希望能夠保留 Java EE 這個(gè)品牌。
2017 年 11 月,項(xiàng)目管理委員會(huì)成立,成員來(lái)自原先的 Java EE 生態(tài)系統(tǒng)。委員會(huì)的首要任務(wù)是完成過(guò)渡、建立新的社區(qū),以及基于 Java EE 8 發(fā)布第一個(gè)版本。
目前有兩個(gè)項(xiàng)目正式成為 EE4J 的一部分:
Yasson:JSON-B 的參考實(shí)現(xiàn)。
EclipseLink:JPA 的參考實(shí)現(xiàn)。
開(kāi)源(Java EE)對(duì)于廠商的影響
對(duì)于 Java EE 廠商(Red Hat、IBM、TomiTribe 和 Payara)來(lái)說(shuō):
他們?cè)?JCP 中將擁有更多的話語(yǔ)權(quán)和影響力。
他們可以自由地訪問(wèn)測(cè)試套件,而之前它是屬于 Oracle 的。
他們可以迭代推出“應(yīng)用服務(wù)器”,不需要再承受 Java EE 新版本發(fā)布的“隧道效應(yīng)”所帶來(lái)的痛苦。
應(yīng)用服務(wù)器的未來(lái)
新的 Java EE 會(huì)成為“保護(hù)傘”抑或是由一系列獨(dú)立的規(guī)范組成?
由此引申出的問(wèn)題是:應(yīng)用服務(wù)器會(huì)繼續(xù)扮演“單體平臺(tái)”的角色,還是會(huì)變成可組合的模塊平臺(tái)?
我傾向于選擇第二種可能,Red Hat 的 Wildfly Swarm 就是最好的例子。
開(kāi)源 Java EE 對(duì)開(kāi)發(fā)者社區(qū)的影響
對(duì)于開(kāi)發(fā)者社區(qū)來(lái)說(shuō),這是一個(gè)很好的機(jī)會(huì),他們需要一個(gè)敏捷的平臺(tái)來(lái)促進(jìn)創(chuàng)新。
對(duì)于開(kāi)發(fā)者個(gè)人而言,參與 EE4J 是一個(gè)非常好的提升個(gè)人影響力的途徑。推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【六七八,二四一,五六三】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享

王者風(fēng)范
對(duì)于用戶來(lái)說(shuō),目前的處境很艱難。Java EE 的優(yōu)勢(shì)在于一系列由 JCP 推動(dòng)的官方標(biāo)準(zhǔn),而依賴這些標(biāo)準(zhǔn)對(duì)于長(zhǎng)期項(xiàng)目來(lái)說(shuō)是至關(guān)重要的。
Java EE 的上一個(gè)階段已經(jīng)走到了尾聲,不管高興與否,我們都要繼續(xù)與它共同前行。新的 Java EE 標(biāo)準(zhǔn)將為我們帶來(lái)什么?沒(méi)有了 JCP 的支持,EE4J 將如何發(fā)展?
這一切要取決于行動(dòng)的快慢和實(shí)際結(jié)果的產(chǎn)出。我粗淺地認(rèn)為,這將受到以下幾個(gè)因素的影響:
時(shí)間:之前已經(jīng)提到,盡管 Java EE 8 仍有它的價(jià)值,但它并不是最先進(jìn)的,所以它需要盡快縮小差距,以便在競(jìng)爭(zhēng)中勝出。如果 EE4J 要花幾個(gè)月“才能”交付一個(gè)版本,那么要實(shí)現(xiàn)這個(gè)目標(biāo)就會(huì)很困難。
與 Microprofile.io 協(xié)作:Microprofile.io 已經(jīng)在云原生應(yīng)用方面發(fā)力,所以完全可以利用它,把它集成到 EE4J 中。
社區(qū):EE4J 社區(qū)將發(fā)展壯大到怎樣的程度?
還是時(shí)間:廠商和開(kāi)源項(xiàng)目是否有能力及時(shí)交付符合 EE4J 規(guī)范的平臺(tái)?Java EE 最大的一個(gè)問(wèn)題就是從規(guī)范最終版的發(fā)布到應(yīng)用服務(wù)器的實(shí)現(xiàn)需要很長(zhǎng)的時(shí)間。
不過(guò),就像昨天文章中評(píng)論的那樣,不管名字是否改變,面對(duì) Spring 框架的強(qiáng)力沖擊,Java EE 路在何方,現(xiàn)在還不好說(shuō)。從目前社區(qū)熱點(diǎn)來(lái)看,我只知道,Spring Boot、Spring Cloud 這套框架很受歡迎。
對(duì)于 Spring 生態(tài)和 Java EE 的關(guān)系,Jean-Fran?ois James 也做了評(píng)論(另外一篇文章)。
Java EE 和 Spring 的復(fù)雜關(guān)系
在之前評(píng)估 Java EE 生態(tài)系統(tǒng)對(duì) EE4J 發(fā)展的影響時(shí),我漏掉了一個(gè)非常重要的因素:Pivotal 和它的 Spring 框架。
Java EE 和 Spring 之間的關(guān)系已經(jīng)進(jìn)入了“最好的敵人”模式。
Spring 誕生于 2004 年,由 Rod Johnson 發(fā)起,作為對(duì) J2EE(Java 2 Platform,Enterprise Edition)和 EJB 2 復(fù)雜性的反擊。從那個(gè)時(shí)候開(kāi)始,Spring 和 Java EE 之間就沒(méi)有停止過(guò)競(jìng)爭(zhēng),并彼此影響對(duì)方:
Spring(以及 Hibernate)的出現(xiàn)刺激了 Java EE 社區(qū),促使他們推出了 EJB 3 和 JAP 1.0。
Spring Batch 直接影響到了 Batch 規(guī)范(JSR 352)。
Spring Dependency Injection 啟發(fā)了 CDI(Context and Dependency Injection)。
Spring 恰到好處地使用了 J2EE 和 Java EE 中的某些標(biāo)準(zhǔn),如 Servlet、JMS 和 JPA。
Spring 5 宣稱兼容 Java EE 8。
從誕生之日起,Spring 就因?yàn)槌瑥?qiáng)的實(shí)用性受到了開(kāi)發(fā)者的青睞,而且它的演進(jìn)速度很快,可以快速地集成新技術(shù):NoSQL、AMQP、微服務(wù)、云原生應(yīng)用……
從 2006 年開(kāi)始,Java EE 也將提升易用性和對(duì)開(kāi)發(fā)者的友好放在首位,但在演進(jìn)速度方面還是很慢,主要有兩個(gè)原因:
JCP 制定規(guī)范需要很長(zhǎng)時(shí)間:即使是一個(gè)輕量級(jí)的規(guī)范,也需要多方參與,需要更長(zhǎng)的時(shí)間才能達(dá)成一致。
實(shí)現(xiàn)和認(rèn)證:在規(guī)范發(fā)布之后,需要幾個(gè)月時(shí)間才能找到符合認(rèn)證的應(yīng)用服務(wù)器。
而最近,這方面的差距在加大:
Spring Boot 將“以約定代替配置(Convention Over Configuration)”的原則發(fā)揮到了極致,進(jìn)一步提升易用性。
Spring Cloud 利用 Netflix 的開(kāi)源組件解決了與云原生應(yīng)用開(kāi)發(fā)相關(guān)的問(wèn)題,如服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、彈性、負(fù)載均衡、監(jiān)控……
Spring 5 將反應(yīng)式編程提升為一等公民。
Java EE 在這方面的速度要慢的多。在 2013 年發(fā)布 Java EE 7 之后,經(jīng)歷了一段消停期。2016 年,在社區(qū)的壓力下,Oracle 才發(fā)布了一個(gè)新的路線圖。
Java EE 8 發(fā)布于 2017 年 9 月,雖然人們對(duì)其期望甚高,但并非革命性的。人們還是把更多的目光投向了 Java EE 9,期望下一個(gè)版本會(huì)有更多的創(chuàng)新。
與此同時(shí),Eclipse 基金會(huì)于 2016 年中啟動(dòng) Microprofile.io 項(xiàng)目,旨在以微服務(wù)架構(gòu)為基準(zhǔn)來(lái)優(yōu)化企業(yè)版 Java,以此來(lái)推動(dòng) Java EE 生態(tài)系統(tǒng)的發(fā)展。Microprofile 1.0 涵蓋了 JAX-RS 2.0、CDI 1.2 和 JSON-P 1.0,1.2 版本于 2017 年 9 月發(fā)布,加入了更多特性,如配置、容錯(cuò)、JWT、度量指標(biāo)和健康檢測(cè),2.0 版本有望與 Java EE 8 看齊。
過(guò)渡到 EE4J
EE4J 旨在提供一種更加靈活的協(xié)作方式,但要成功,有一些前提是不可或缺的:
Java EE 8 遺留資產(chǎn)的轉(zhuǎn)移(規(guī)范文檔、參考實(shí)現(xiàn)和測(cè)試套件)。據(jù) David Delabassee 所述,這項(xiàng)工作已經(jīng)在進(jìn)行當(dāng)中。
建立新的監(jiān)管模型和操作系統(tǒng),在最近發(fā)布的工作組章程中已經(jīng)提到了這一點(diǎn)。
建立活躍的社區(qū)。
品牌和包的重新命名:Oracle 不允許 EE4J 在新規(guī)范中重用“Java EE”這個(gè)商標(biāo)和 javax 這個(gè)包名,所以需要重新起一個(gè)名字。
在滿足了這些條件之后,EE4J 就可以繼續(xù)演進(jìn),適應(yīng)云原生應(yīng)用和 Java SE 平臺(tái)(特別是 Java 的模塊化系統(tǒng))的變更。
大一統(tǒng)的時(shí)機(jī)?
除了監(jiān)管和技術(shù)之外,EE4J 必須為自己找到合適的位置,因?yàn)闆](méi)有了 JCP 的支持,它作為標(biāo)準(zhǔn)的地位就不復(fù)存在。在這樣的情況下,EE4J 已無(wú)力與 Spring 展開(kāi)競(jìng)爭(zhēng)?;蛘哒f(shuō),整個(gè) Java 生態(tài)系統(tǒng)經(jīng)不起這樣的“內(nèi)戰(zhàn)”。Java 在應(yīng)用服務(wù)器方面的霸主地位已經(jīng)一去不復(fù)返,它必須與其他平臺(tái)展開(kāi)競(jìng)爭(zhēng),比如 Node.js、Go 和 Python。如果能夠?qū)⒄麄€(gè)社區(qū)甚至整個(gè)行業(yè)的力量帶動(dòng)起來(lái),那就更好了。
為什么不呢?如果 EE4J 能夠推出一些獨(dú)立的兼容規(guī)范,Spring 團(tuán)隊(duì)就可以參與進(jìn)來(lái),讓 Spring 成為 EE4J 的主要參與者。
作為 Java 開(kāi)發(fā)者和用戶,我們拭目以待。我的夢(mèng)想,會(huì)成真嗎?