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