JAVA 那些事 - 聊聊那些易混淆的概念:JVM/JRE/JDK,openJDK/oracleJDK,JAVA SE/JAVA EE/Jakarta EE

简介: JAVA 那些事 - 聊聊那些易混淆的概念:JVM/JRE/JDK,openJDK/oracleJDK,JAVA SE/JAVA EE/Jakarta EE

大家好,我是明哥。

本篇博文,跟大家一起回顾下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

640.png640.png

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);

640.png640.png

  • 自 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);

640.png

  • 由于 Jakarta EE 9 及以后版本,实施了包命名空间的修改,所以所有依赖这些 API 规范的上层应用程序,都需要对应修改,比如 Tomcat, Websphere,Jboss,等等;(比如 Tomcat 10做了对应的修改)

640.png

相关文章
|
4月前
|
存储 算法 Java
jvm性能优化(一)-基于JDK1.8
jvm性能优化(一)-基于JDK1.8
|
11天前
|
缓存 Java 开发者
Java字面量详解:概念、分类与使用实例
本文介绍了Java字面量的概念、分类及应用。
33 11
|
1月前
|
存储 Java 程序员
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
|
28天前
|
Java 数据安全/隐私保护
Java的基础概念(二)
本文介绍了Java编程语言中的运算符和表达式,涵盖算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等。重点讲解了算术运算符的使用,如加减乘除取余,并强调了整数除法和取余的特殊性。同时,详细说明了隐式转换与强制转换的概念及应用场景,以及字符串和字符的拼接规则。通过多个案例演示了不同运算符的实际应用,包括数值拆分、自增自减、三元表达式的使用等。最后简要提及了运算符的优先级,指出小括号具有最高优先级。
|
5月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
2月前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
69 1
|
4月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
4月前
|
Oracle Java 关系型数据库
Java(TM) Platform SE binary 已停止工作”的解决方法
Java(TM) Platform SE binary 已停止工作”的解决方法
334 2
|
5月前
|
安全 Java 编译器
Java 基础语法-面试题(53道)(基础概念+基础语法+流程控制)
Java 基础语法-面试题(53道)(基础概念+基础语法+流程控制)
77 18
|
5月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
89 2