本文转载自微信公众号「明哥的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做了对应的修改)