我们如何定义Java?

发布于:2021-02-04 14:55:20

0

175

0

java JDK 开发工具包 Java虚拟机 编程语言

Java是一个超负荷的词。首先,它是印尼一个岛屿的名字,也是咖啡的一个术语。然后我们有了Java,即计算平台。即便如此,这个词也有几个含义:我们说的是Java编程语言语法,Java虚拟机还是Java开发工具包(JDK)?我们可以使用更多的方式来使用Java这个术语:card、embedded、Micro Edition和enterpriseedition(至少现在我们已经消除了Jakarta EE的歧义)。我肯定还有很多。

我拿着这个去哪?好吧,作为我在JDK迁移白皮书上所做工作的一部分,我正在编译一个关于oraclejdk和zulujdk之间差异的精确列表,这是OpenJDK项目提供的源代码的直接构建。由于我也是javase规范的专家组成员,这让我想到了如何定义Java的哪些是和哪些不是一部分(这让我想到了Java的真正含义)。

在去年jdk9发布的同时,Oracle发布了一系列关于JDK未来的开发和交付方式的公告。我以前写过很多这方面的内容,但其中一部分是消除了oraclejdk和从OpenJDK源代码构建的JDK之间的所有功能差异。这项工作将在今年晚些时候jdk11发布时完成,包括向OpenJDK项目添加组件以及从oraclejdk中删除特性。

其中大部分已经被广泛宣传。以前的商业特性,如应用程序级数据共享、Java飞行记录器和Java任务控制,都是由Oracle作为开放源代码贡献给OpenJDK项目的。JavaFX、浏览器插件和javawebstart等其他特性都将从jdk11的Oracle实现中删除。

我想说的是,这是如何定义的。把它放到维恩图中是很有用的,这样可以更清楚地理解事情。

最小的部分是javase。这是JSR通过JCP定义的规范。如果您想创建一个可以称为Java的东西,那么这是您需要提供的最低要求。这包括标准的库集(所有java和javax包,以及一些组织.xml以及可以处理已定义字节码集的JVM。JVM是根据功能来定义的,比如它需要一个垃圾收集器,而不是如何实现它。

在下一个层次,我们有OpenJDK。这是javase标准的参考实现,因此自然包含了其中的所有内容。它还包括javase没有定义的东西。像JavaScript引擎Nashorn这样的东西是OpenJDK的一部分,而不是javase(javase规范定义了脚本引擎的接口,但没有定义任何这样的引擎的实现)。

由于OpenJDK是javase的超集,OpenJDK项目提出了另一种方法来定义OpenJDK的新特性。这些被称为JDK增强建议(JEPs)。虽然不是一个正式的标准过程,但这是一个开放的过程。任何拥有OpenJDK提交者身份的人都可以自由提交JEP。当然,因为我们要处理的是核心Java平台,几乎有数百万的开发人员在使用它,所以作为JEP提交一个有趣的想法并不能让它被接受(事实上,远不是这样)。到目前为止,只有一个改变API的特性JEP被Oracle以外的人成功提交、接受和发布。那是杰普285,我们在阿祖尔的提示。这是向Thread类添加了一个方法,在许多实现中,这个方法什么也不做。我们需要付出大量的努力和审查,才能将其应用到OpenJDK中。同样,考虑到Java的广泛使用,这是非常令人放心的。

还有一些非Oracle JEP用于JDK的不同端口(SAP的JEP 175和JEP 294以及Red Hat的JEP 237),还有一个将包含在JDK 11中(Red Hat的Epsilon垃圾收集器JEP 318)。

有趣的是,JEP这个词最近有点用词不当。两个jep 313和320描述了特征的删除。我想你可以通过移除一些东西来增强某些东西,但这似乎有点违反直觉。

最后,我们有了oraclejdk。因为这是Oracle的OpenJDK的二进制发行版,所以他们可以自由地添加任何他们想增加价值的特性。JavaFX就是一个很好的例子。JavaFX有自己的开源项目(OpenJFX),它独立于OpenJDK。JavaFX从未集成到javase标准中(与AWT和Swing不同)。删除这样的功能完全由甲骨文自行决定,但他们在通过各种博客文章(稍后会有更多内容)宣传这样的内容方面做得相当不错。

让我们回到我之前所说的关于研究OpenJDK和oraclejdk之间的差异。作为本文的一部分,我对jdk10和jdk11中的模块列表进行了直接的区分。原来有31个模块被移除,两个模块被添加。

首先,是删除java.se.ee文件聚合器模块。本文引用了六个模块,它们是JavaSE的一部分,因此已从JavaSE11规范中删除。聚合器模块和两个相关的特定于jdk的模块不是javase规范的一部分。

  • java.se.ee

  • java.activation

  • java.corba

  • java.transaction

  • java.xml.bind

  • java.xml.ws.annotation

  • java.xml.ws

  • jdk.xml.bind(非Java SE)

  • jdk.xml.ws(非Java SE)

HTTP/2孵化器模块(在jdk9中引入)已经被删除,并替换为现在是javase标准的一部分。这在jep110、jep321和javase11规范中有描述。

  • jdk.incubator.httpclient客户端替换为java.net.http

JavaFX的模块。正如我所提到的,这些模块只包含在oraclejdk中,尽管JavaFX是更广泛的OpenJDK项目的一部分。他们被撤职的消息在这里宣布了。

  • javafx.base

  • javafx.controls

  • javafx.deploy

  • javafx.fxml

  • javafx.graphics

  • javafx.media

  • javafx.swing

  • javafx.web

对于相关的Java packager,有两个特定于JDK的模块。

  • jdk.packager

  • jdk.packager.services

浏览器插件和JavaWebStart模块。这些特性的删除在这里和这里的模块一起被公布,这些模块主要是针对Oracle的,但是还有java.jnlp文件模块。

这个模块让我很困惑。根据JDK文档,所有Java SE模块的名称都以java开头,但是似乎不是所有以java开头的模块都在Java SE中,因为java.jnlp不是标准的一部分。但是,JCP将其定义为 JSR 56。这样,根据 描述模块化JDK的JEP 200,模块名称以java开头。JSR 56的参考实现从未作为开源发布,因此它只是Oracle JDK的一部分。

  • java.jnlp

  • jdk.javaws

  • jdk.plugin

  • jdk.plugin.server

  • jdk.deploy

  • jdk.deploy.controlpanel

然后是其他模块。有两个明显是甲骨文特有的,因为它包含在名称中。似乎因为它们是桌面和网络模块,所以它们的前缀是oracle而不是jdk,以防止混淆。

  • oracle.desktop(Oracle AWT实用程序)

  • oracle.net(SDP和NIO Oracle的补充)

最后,我们还有另外三个特定于Oracle的模块。在这些情况下,除了JDK 10的along文档声明这些特性被弃用之外,其他地方似乎都没有宣布删除这些特性。我有点惊讶的是,SNMP支持的删除没有在某处宣布(如果我错了,请纠正我,但是标准搜索没有显示任何内容)。

  • jdk.management.resource(资源管理)

  • jdk.management.cmm(协同内存管理)

  • jdk.snmp(SNMP支持)

至少从jdk11开始,Venn图缩小到只有两个圆:OpenJDK和javase。

我计划在以后的博客文章中更详细地讨论JCP和OpenJDK之间的关系以及Java特性是如何被添加或删除的。