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

相关文章
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
176 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
3月前
|
存储 算法 Java
JvM JDK JRE 三者区别与联系详解
本文深入解析了Java编程中的三个核心概念:JVM(Java虚拟机)、JDK(Java开发工具包)和JRE(Java运行环境)。JVM是执行Java字节码的虚拟计算机,实现“一次编译,到处运行”;JDK包含JRE及开发工具,用于编写和调试Java程序;JRE负责运行已编译的Java程序。文章详细阐述了它们的功能、组成及应用场景,并通过实例说明其在实际开发中的作用,帮助开发者理解三者联系与区别,提升开发效率与问题解决能力。适合Java初学者及进阶开发者学习参考。
514 3
|
3月前
|
监控 Oracle Java
JVM JDK JRE 使用指南及组件封装方法详解
本指南全面介绍了JVM、JDK、JRE的使用方法与Java组件封装技巧。内容涵盖JDK安装配置、JRE使用、JVM参数调优(如堆内存设置和垃圾回收器选择),以及类、包的封装实践。通过示例展示工具类与数据访问组件的封装方法,并讲解JAR包创建与发布流程。此外,还提供了常见问题解决方案,如内存溢出处理和依赖冲突管理。帮助开发者掌握高效、规范的Java开发技能,提升代码复用性和可维护性。附带面试资料供进一步学习。
152 0
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
169 2
|
人工智能 Java 编译器
Java零基础(3) - 区别JDK、JRE和JVM
【8月更文挑战第3天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
149 1
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
1038 0
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的"Hello, World!"示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
171 0
|
缓存 Java 编译器
JRE、JDK、JVM 和 JIT 之间的区别详解
【8月更文挑战第22天】
620 0