当前位置: 首页 > 科技观察

Java那些事儿——说说那些令人困惑的概念:OpenJDK-oracleJDK、JavaEE-JakartaEE

时间:2023-03-12 19:07:39 科技观察

转载本文请联系鸣哥IT随笔公众号。大家好,我是明哥。在这篇博文中,我将和大家一起回顾一下JAVA的那些容易混淆的概念,包括JVM/JRE/JDK、openJDK/oracleJDK、JAVASE/JAVAEE/JakartaEE。1JVM/JRE/JDKJVM,JavaVirtualMachine,即JAVA虚拟机,负责执行JAVA程序。JVM首先解释JAVA编译器编译出的bytecode字节码,然后将类相关信息存放在内存中,最后执行bytecode字节码。JVM有自己的指令集,并在运行时管理各种内存区域。JVM包括以下组件:ClassLoadersRun-TimeDataAreasExecutionEngine执行引擎JRE,JavaRuntimeEnvironment,即JAVA运行环境,是运行JAVA应用程序所需的一系列软件组件。JRE包含以下核心组件:Java虚拟机的实现:JVM的实现运行Java程序所需的类:运行JAVA应用程序所需的基本类属性文件:配置文件/属性文件JDK、JavaDevelopmentKit、即JAVA开发包提供了开发/编译/调试/执行JAVA应用程序的环境和工具。JDK包含以下几个核心组件:JREDevelopmentTools开发工具从上面可以看出,三者的关系是:JDK包含JRE,JRE包含JVM;运行JAVA应用程序,需要安装JRE;开发和调试JAVA应用程序,需要安装JDK;在JDK8及之前,安装JDK时,JDK目录下包含JRE子目录;在JDK9及以后,安装JDK后,默认不包含JRE子目录,JRE子目录可以通过以下命令生成:bin\jlink.exe--module-pathjmods--add-modulesjava.desktop--outputjreJDK8JDK112各种常见的JDK构建——openJDK、oracleJDK、AzulZulu...Java原名Oak,是SunMicrosystems的JamesGosling和他的团队推出的Java编程语言和Java平台的总称1995年5月;Sun在JavaOne2006年宣布开源Java并建立OpenJDK社区,随后Sun在GPL下发布了Java类库的源代码(OpenJDK即OpenJDKProject(JavaSE7-JavaSE9)/JDK项目(JavaSE10及其以后产生的JavaSE的官方开源参考实现),而具体版本的开发标准是JavaCommunityProcess(JCP)发布的JavaSpecificationRequests(JSR,Java规范请求))社区由甲骨文和IBM牵头,成员包括阿里巴巴、亚马逊、Ampere、Azul、BellSoft、Canonical、富士通、谷歌、华为、英特尔、Java社区、JetBrains、伦敦Java社区、微软、红帽、SAP、SouJava、SUSE、腾讯、推特、VMWare等;OpenJDK社区只发布OpenJDK源代码,不提供可以直接使用的二进制文件格式。现在可以直接使用的二进制格式的JDK是不同厂家编译的程序。OpenJDK官网指向的二进制文件是下载地址其实是Oracle的OpenJDK构建的下载地址,包括免费版和商业版:(两个版本基于相同的代码,但一个使用GPL许可另一个使用oracle许可证);从JavaSE7开始,到后来的版本,所有的JDK都是从OpenJDK派生出来的(OpenJDK和其他JDK的关系和Linux及其众多发行版一样);所以总结一下:OracleJDK是Oracle基于OpenJDKProject(JavaSE7-JavaSE9)/JDKProject(JavaSE10andlater),在OpenJDK社区(OpenJDKCommunity)的领导下,基于JavaSpecificationRequest(JavaSpecificationRequest)由JavaCommunityProcess(JavaCommunityProcess)作为标准制定,生产本质上,OracleJDK也是OpenJDK的发行版之一;使用最多的Java构建仍然是OracleJDK,但也有AdoptOpenJDK、Oracle的OpenJDK、AmazonCorretto、AzulZulu,以及国内的AlibabaDragonwell、华为必胜JDK、腾讯Kona等;3JAVASE、JAVAEE和JakartaEE3.1JAVASEJAVASE,即JavaStandardEdition,较早的版本称为J2SE:JAVASE是构建所有JAVA应用程序Basic的基础,它包含了java.lang类下的所有类。lang包、I/O类、ThreadingAPI、RMI包和类、i18n国际化类、JDBCAPI、CollectionsAPI(List、Map、Set等)、AWT和Swing类(创建桌面应用程序和小程序等)等;常见的JAVASE构建的JAVA应用包括IntelliJIDEAIDE、ServletContainers(如Tomcat)、RDBMS(如ApacheDerby)、SQuirreL等;我们通过安装JDK(如OracleJDK),就可以得到JAVASE的基础类库;3.2JavaEEJavaEE,即JavaEnterpriseEdition,较早的版本称为J2EE:JavaEE是开发企业级JAVA应用程序的一系列规范。包括:Servlet规范(处理HTTP请求-响应)、EJB规范(事务处理和组件生命周期管理)、JMS规范(消息处理)、JPA规范等;JavaEE本身只是一个规范,只是一系列的API接口,不包含具体的实现;JavaEE具体实现由各种JavaEE容器提供,如GlassFish、WebLogic、WebSphere、Tomcat等;(当然,这些容器在底层使用了JavaSE中的各种类);JavaEE5之后,推出了GlassFish项目,GlassFish是JavaEE的官方开源参考实现;各种JavaEE容器对JAVAEE规范有不同的实现,有的只实现了部分规范:如Tomcat、Jetty等只实现了Servlet规范(通常称为JAVAweb/servlet容器),而GlassFish、WebLogic、WebSphere等实现所有JAVAEE规范;(通常称为JAVA应用服务器JAVA应用服务器);3.3JakartaEEJakartaEE,即JavaEnterpriseEdition,较早的版本称为J2EE:JAVAEE的最后一个版本是JAVAEE8,然后在2017年8月,Oracle宣布开源JavaEE,并将项目交给了Eclipse基金会,将由这个开源基金会全面接管JavaEE的管理和开发;(捐赠JavaEE的Oracle,也在Eclipse基金会的董事会中占有一席之地);Oracle向Eclipse基金会移交的内容包括:其领先的JavaEE技术(规范),以及相关的GlassFish技术(标准参考实现),技术兼容性工具包(TCKs:TechnologyCompatibilityKit),以及“相关项目文档”,以及希望通过Eclipse基金会在开源项目治理、JavaEE及相关技术方面的丰富经验,共同将JavaEE带向更美好的未来;但在交接过程中,Oracle提出了一系列令Eclipse基金会无法接受的要求,例如:Oracle要求Eclipse基金会发布的产品(如EclipseIDE)只能捆绑Oracle认证(不能捆绑任何其他供应商认证)Java运行时(这意味着像GlassFish和EclipseIDE这样的EclipseFoundation产品将不再是供应商中立的,因此基金会的免税地位可能不再有效,这将对基金会造成财务灾难,这可能会导致基金会关闭。更重要的是,这个要求并不是在谈判开始时提出的,而是在谈判开始很久之后,也就是在交接的时候提出的。外界猜测,这是甲骨文的回应IBM开源OpenJ9JVM的反应,毕竟这对其Java业务构成了明显的威胁。)Oracle要求Eclipse基金会不要修改old代码,如果需要修改,必须重命名,包括工程名和包名。这意味着现有的应用程序如果不进行重构和重新编辑,就无法在更新后的平台上运行。经过数月的友好谈判,Eclipse基金会和Oracle无法就更改javax包命名空间和以前JavaEE规范中使用的Java商标协议的条款达成一致。最终的共识是JakartaEE不能发布底层库javax的修改包,JakartaEE规范也不能使用包含Java商标的现有规范名称。(由于谈判的复杂性和保密性,Eclipse基金会和甲骨文都同意不透露谈判结果的原因。但消息人士称,甲骨文利用其董事会席位干预决策。)转让后,由于商标限制,Oracle不允许开源组织使用JavaEE的名称,因此Eclipse基金会选择了两个备选名称,“JakartaEE”和“EnterpriseProfile”。64.4%的选票获得,也就是说JavaEE正式更名为JakartaEE;迁移后,Oracle由于商标限制,对javax.*包命名空间的使用进行了各种限制(JakartaEE无法发布库javax的修改包:貌似可以创建新的接口/类,但是子包不能创建后,原来的接口/类不能修改?);EclipseJakartaEE项目,经过各种讨论和权衡,最终决定将javax.*包下的所有API和实现都重命名并迁移到jakarta.*包命名空间,从而明确区分JAVAEE和JakartaEE,并明确JakartaEE各种规范的后续演进方向;(JakartaEE“BigBang”重命名选项:JakartaEE将重命名其所有规范以使用jakarta.*,以便继续发展具有云原生Java平台特性的平台。);JakartaEE9,实现了从javax.*包命名空间重命名为jakarta.*的实现(事实上,在JakartaEE9中,除了包命名空间的变化之外没有任何重大变化:从功能上讲,JakartaEE9仍然与JavaEE8基本相同;JakartaEE10将是第一个出现新功能的版本);由于JakartaEE9及之后的版本实现了包命名空间的修改,所有依赖这些API规范的上层应用都需要进行相应的修改,例如Tomcat、Websphere、Jbos等;(例如Tomcat10做了相应的修改)