Java那些事-聊聊那些易混淆的概念:OpenJDK/oracleJDK,Java EE/Jakarta EE
本文轉(zhuǎn)載自微信公眾號「明哥的IT隨筆」,作者IT明哥。轉(zhuǎn)載本文請聯(lián)系明哥的IT隨筆公眾號。
大家好,我是明哥。
本篇博文,跟大家一起回顧下JAVA那些易混淆的概念,包括 JVM/JRE/JDK,openJDK/oracleJDK,以及 JAVA SE/JAVA EE/Jakarta EE。
1 JVM/JRE/JDK
JVM,Java Virtual Machine,即 JAVA 虛擬機,是負責執(zhí)行 JAVA 程序的。JVM 首先解釋 JAVA 編譯器編譯獲得的 bytecode 字節(jié)碼,然后將類相關(guān)信息存儲在內(nèi)存中,最后執(zhí)行 bytecode 字節(jié)碼。JVM 有自己的 instruction set 指令集, 并在運行時管理各種內(nèi)存區(qū)域。JVM 包含以下組件:
- Class Loaders 類加載器
- Run-Time Data Areas 運行時數(shù)據(jù)區(qū)
- Execution Engine 執(zhí)行引擎
JRE, Java Runtime Environment,即 JAVA 運行時環(huán)境,是一系列運行 JAVA 應用程序所需的軟件組件。JRE 包含以下核心組件:
- An implementation of a Java Virtual Machine:JVM 的一個實現(xiàn)
- Classes required to run the Java programs:運行JAVA 應用程序需要的基礎(chǔ)類
- Property Files:配置文件/屬性文件
JDK, Java Development Kit,即 JAVA 開發(fā)工具包,提供了開發(fā)/編譯/調(diào)試/執(zhí)行 JAVA 應用程序的環(huán)境和工具。JDK 包含以下核心組件:
- JRE
- Development Tools 開發(fā)工具
從上文可以看出,三者之間的關(guān)系是:
- JDK 包含JRE,JRE又包含JVM;
- 運行JAVA應用程序,需要安裝 JRE;
- 開發(fā)調(diào)試JAVA應用程序,需要安裝 JDK;
- 在JDK8及以前,安裝JDK時,JDK目錄中包含JRE子目錄;
- 在JDK9及以后,安裝JDK后,默認是沒有包含JRE子目錄的,可以通過以下命令生成 JRE 子目錄: bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
JDK8
JDK11
2 常見的各種 JDK builds - openJDK, oracle JDK,Azul Zulu...
- Java 原名 Oak, 是 Sun Microsystems 公司的 James Gosling 及其團隊于 1995 年 5 月推出的 Java 程序設(shè)計語言 和 Java 平臺 的總稱;
- Sun 在 JavaOne 2006 中宣布將開源 Java,并建立了 Open JDK 社區(qū),隨后 Sun 在 GPL 下陸續(xù)發(fā)布了 Java 類庫的源代碼(除了一些被第三方授權(quán)給 Sun 且 Sun 無法根據(jù) GPL 重新授權(quán)的受限部分之外);
- OpenJDK 是由 OpenJDK Community 領(lǐng)導的 OpenJDK Project(Java SE 7 - Java SE 9)/ JDK Project(Java SE 10及其以后)產(chǎn)出的 Java SE 的官方開源參考實現(xiàn),其具體版本的開發(fā)標準是 Java Community Process(JCP) 發(fā)布的 Java Specification Requests(JSR,Java規(guī)范請求),該社區(qū)由 Oracle、IBM 領(lǐng)導,成員包括 Alibaba,Amazon,Ampere,Azul,BellSoft,Canonical,F(xiàn)ujitsu,Google,Huawei,Intel,Java Community,JetBrains,London Java Community,Microsoft,Red Hat,SAP,SouJava,SUSE,Tencent,Twitter ,VMWare 等等;
- OpenJDK 社區(qū)只發(fā)布 OpenJDK 源碼,并不提供可以直接使用的二進制文件格式,現(xiàn)在能直接使用的二進制格式的 JDK, 都是被不同廠商編譯之后的程序,其中 OpenJDK 官網(wǎng)指向的二進制文件的下載地址,實際是 Oracle’s OpenJDK builds 的下載地址,包括免費版本和商業(yè)版本兩個版本:(兩個版本基于相同的代碼,只是一個使用 GPL license,一個使用 oracle的license);
- 自 Java SE 7開始往后的版本,所有的 JDK 都源自于 Open JDK (OpenJDK 與 其他 JDK 的關(guān)系就和 Linux 與它的眾多發(fā)行版是一樣一樣的);
所以概括起來:
- OracleJDK 是 Oracle 基于 OpenJDK Project(Java SE 7 - Java SE 9)/ JDK Project(Java SE 10及其以后),在 OpenJDK Community (OpenJDK 社區(qū))的領(lǐng)導下,以 Java Community Process(Java 社區(qū)進程)制作的 Java Specification Request(Java 規(guī)范請求)為標準,制作出的 OpenJDK 所制作的商業(yè)版構(gòu)建,本質(zhì)上來說,OracleJDK 也是 OpenJDK 的發(fā)行版之一;
- 目前使用最多的 Java builds 仍舊是 OracleJDK,但其后分別還有 AdoptOpenJDK、Oracle's OpenJDK、Amazon Corretto、Azul Zulu,以及國內(nèi)的 Alibaba Dragonwell、Huawei bisheng JDK、Tencent Kona 等;
3 JAVA SE, JAVA EE,與 Jakarta EE
3.1 JAVA SE
JAVA SE,即 Java Standard Edition, 早期版本稱為 J2SE:
- JAVA SE 是構(gòu)建所有 JAVA 應用程序的基礎(chǔ),其包含的類有 java.lang 包下的所有類,I/O 類,Threading API, RMI 包和類,i18n 國際化類,JDBC API, Collections API (List, Map, Set 等), AWT 和 Swing 類(創(chuàng)建桌面應用和applets等),等等;
- 常見的 JAVA SE 構(gòu)建的JAVA應用,有 IntelliJ IDEA IDE, Servlet Containers (如 Tomcat), RDBMS (如 Apache Derby),SQuirreL,等等;
- 我們通過安裝JDK (如OracleJDK),即可獲得 JAVA SE 的基礎(chǔ)類庫;
3.2 Java EE
Java EE,即 Java Enterprise Edition, 早期版本稱為 J2EE:
- Java EE 是一系列開發(fā)企業(yè)級 JAVA 應用的規(guī)范,這些規(guī)范具體來講包含:Servlet 規(guī)范(處理 HTTP request-response),EJB 規(guī)范 (事務處理和組件生命周期管理),JMS 規(guī)范 (消息處理),JPA 規(guī)范,等等;
- Java EE 本身只是一個規(guī)范,只是一系列 API接口,并不包含具體的實現(xiàn);
- Java EE 具體的實現(xiàn),有各種 Java EE 容器,如 GlassFish,WebLogic, WebSphere, Tomcat等來提供;(當然了,這些容器在底層使用了 Java SE 中的各種類);
- Java EE 5 之后,啟動了項目 GlassFish,GlassFish 是Java EE 的官方開源參考實現(xiàn);
- 各種 Java EE 容器對 JAVA EE 規(guī)范的實現(xiàn)不同,且有的只實現(xiàn)了其中的一部分規(guī)范:比如 Tomcat,Jetty 等只實現(xiàn)了 Servlet 規(guī)范 (經(jīng)常被稱為JAVA web/servlet 容器),而 GlassFish,WebLogic, WebSphere 等實現(xiàn)了 JAVA EE 所有規(guī)范;(經(jīng)常被稱為JAVA 應用服務器 JAVA application servers);
3.3 Jakarta EE
Jakarta EE,即 Java Enterprise Edition, 早期版本稱為 J2EE:
- JAVA EE 的最后一個版本是JAVA EE 8,此后于2017年8月,Oracle 宣布開源 Java EE 并將項目移交給 Eclipse 基金會,由這個開源基金會全面接管 Java EE 的管理和發(fā)展;(將 Java EE 捐贈出去的 Oracle 也因此在 Eclipse 基金會的董事會中占得一席之地);
- Oracle 移交給 Eclipse 基金會的內(nèi)容,包括:其主導的 Java EE 技術(shù)(規(guī)范),及相關(guān)的 GlassFish 技術(shù)(規(guī)范的參考實現(xiàn)),技術(shù)兼容性工具包(TCKs:Technology Compatibility Kit),以及“相關(guān)的項目說明文檔”,并希望通過 Eclipse 基金會在開源項目治理、Java EE 及相關(guān)技術(shù)方面的豐富經(jīng)驗共同將 Java EE 帶向更美好的未來;
- 但在移交過程中,Oracle 卻提出了一系列 Eclipse 基金會難以接受的要求,諸如:
- Oracle 要求由 Eclipse 基金會發(fā)行的產(chǎn)品(如 Eclipse IDE)必須只能捆綁由 Oracle 認證(而不是任何其他供應商認證)的 Java 運行時。(這意味著 Eclipse 基金會的產(chǎn)品如 GlassFish 和 Eclipse IDE 將不再是供應商中立,從而導致基金會的免稅狀態(tài)可能不再有效,這對基金會而言將是財務上的災難,有可能導致基金會關(guān)閉。更重要的是,這一要求并不是在談判開始時提出的,而是在談判開始很久以后才提出,那個時候交接工作正在進行中。外猜測這是 Oracle 對 IBM 開源 OpenJ9 JVM 的反應,畢竟這對它的 Java 業(yè)務構(gòu)成了明顯的威脅。)
- Oracle 要求 Eclipse 基金會不能修改舊的代碼,如需修改則要重命名,包括項目名稱和軟件包的名稱。這意味著現(xiàn)有的應用程序無法在沒有重構(gòu)和重新編輯的情況下運行在更新后的平臺上。
- 經(jīng)過許多個月的友善談判,Eclipse 基金會和 Oracle 無法就修改 javax 包命名空間,以及在此前的 Java EE 規(guī)范中曾使用的 Java 商標協(xié)議條款達成一致。而最后達成的共識就是,Jakarta EE 不能發(fā)布針對基礎(chǔ)庫 javax 的修改包,Jakarta EE 規(guī)范也不能使用包括 Java 商標的現(xiàn)有規(guī)范名稱。(由于談判的復雜性和保密性,Eclipse 基金會和 Oracle 都同意不公開導致談判結(jié)果的原因。不過有消息稱 Oracle 利用了它在董事會的席位去干預決策。)
- 移交后,Oracle 出于商標權(quán)限制,不允許開源組織用 Java EE 的名號,于是 Eclipse 基金會選出了 "Jakarta EE" 和"Enterprise Profile" 兩個備選名字,經(jīng)過投票,最終前者以64.4%的票數(shù)獲勝,也就是說,Java EE已經(jīng)正式更名為 Jakarta EE;
- 移交后,Oracle 出于商標權(quán)限制,對 javax.* 包命名空間的使用做了各種限制(Jakarta EE 不能發(fā)布針對基礎(chǔ)庫 javax 的修改包:好像是可以創(chuàng)建新的接口/類,但不能創(chuàng)建子包,也不能對原來的接口/類進行修改?);
- Eclipse Jakarta EE project,經(jīng)過各種討論和權(quán)衡,最后決定將 javax.* 包下的所有API 和實現(xiàn),重命名遷移到 jakarta.* 包命名空間下,從而明確區(qū)分 JAVA EE 和 Jakarta EE,并為后續(xù) Jakarta EE 各種規(guī)范的演進掃清障礙;(Jakarta EE “Big Bang” Rename Option:Jakarta EE will rename all of its specifications to use jakarta.* in order to move forward with evolving the platform with features as the cloud-native Java platform.);
- Jakarta EE 9,實施了從 javax.* 到 jakarta.* 的包命名空間重命名操作 (事實上,Jakarta EE 9 中,除了對包命名空間的改動,沒有其它任何大的修改:Functionally speaking, Jakarta EE 9 is still essentially the same as Java EE 8;Jakarta EE 10 will be the first version in which new functionality will appear);
- 由于 Jakarta EE 9 及以后版本,實施了包命名空間的修改,所以所有依賴這些 API 規(guī)范的上層應用程序,都需要對應修改,比如 Tomcat, Websphere,Jboss,等等;(比如 Tomcat 10做了對應的修改)