我们如何定义Java?

Java是一个非常重载的词。 首先,它是印度尼西亚岛屿的名称,也是咖啡的术语。 然后我们有了Java,即计算平台。 即使到那时,这个词也有多种含义:我们是在谈论Java是编程语言语法 ,还是Java是虚拟机还是Java开发工具包(JDK) 我们可以使用很多其他方式来使用Java术语: cardEmbeddedMicro EditionEnterprise Edition (至少现在我们对这是Jakarta EE毫无歧义)。 我敢肯定还有更多。

我要去哪里? 好吧,作为我在进行JDK迁移白皮书时所做的工作的一部分,我正在编译Oracle JDKZulu JDK之间差异的确切列表,这是OpenJDK项目提供的源代码的直接构建。 由于我也是Java SE规范专家组成员,因此这使我开始思考如何定义Java的组成部分和不组成Java的部分(然后让我考虑一下Java的实际含义)。

大约在去年发布JDK 9的同时, Oracle发布了许多关于将来如何开发和交付JDK 的公告 我之前已经写过很多文章 ,但是其中一部分是消除了Oracle JDK与从OpenJDK源代码构建的JDK之间的所有功能差异。 这项工作将在今年晚些时候发布JDK 11时完成,涉及向OpenJDK项目中添加组件以及从Oracle JDK中删除功能。

其中许多已经得到了很好的宣传。 诸如应用程序类数据共享Java Flight Recorder和Java Mission Control之 类的商业功能全部由Oracle作为开源贡献给OpenJDK项目。 JavaFX浏览器插件Java Web Start之类的其他功能都将从JDK 11的Oracle实现中删除。

我要讲的重点是如何定义它。 将其放入维恩图中很有用,以便更清楚地了解事物。

我们如何定义Java?

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

还请参见: Java SE发布节奏常见问题:好处,迁移,LTS等

在下一级别,我们有了OpenJDK 这是Java SE标准的参考实现,因此自然包含其中的所有内容。 它还包括Java SE未定义的内容。 诸如JavaScript引擎Nashorn之类的东西是OpenJDK的一部分,但不是Java SE(Java SE规范定义了脚本引擎接口,而不是任何此类引擎的实现)。

由于OpenJDK是Java SE的超集,因此OpenJDK项目想出了另一种方法来定义OpenJDK的新功能。 这些称为JDK增强建议(JEP)。 尽管不是正式的标准流程,但这是一个开放的流程 具有OpenJDK提交者身份的任何人都可以*提交JEP。 当然,由于我们要处理的是数以百万计的开发人员所使用的核心Java平台,因此提交有趣的想法作为JEP会使它被接受(实际上是远远没有得到)并不是一种必然的想法。 迄今为止,只有一个更改API的功能JEP已成功提交,接受并由Oracle外部的人发布。 那就是JEP 285,我们在Azul的旋转等待提示 这是在Thread类中添加的单个方法,在许多实现中它什么都不做。 为了进入OpenJDK,我们需要付出大量的努力和审查。 再次,鉴于Java的广泛使用,这令人放心。

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

有趣的是,JEP一词最近已被误用。 两个JEPS 313320描述了特征的removal 我想您可以通过删除内容来增强某些功能,但这似乎有点违反直觉。

最后,我们有Oracle JDK。 由于这是Oracle的OpenJDK二进制发行版,因此他们可以*添加他们希望增加价值的任何功能。 JavaFX是一个很好的例子。 JavaFX有自己的开源项目( OpenJFX ),与OpenJDK分开。 JavaFX从未集成到Java SE标准中(与AWT和Swing不同)。 删除此类功能完全由Oracle决定,但是它们在通过各种博客文章公开此类内容方面一直表现得相当不错(稍后会详细介绍)。

让我们回到我之前说的关于研究OpenJDK和Oracle JDK之间差异的内容。 在此过程中,我对JDK 10和JDK 11中的模块列表进行了直接比较。结果发现,已删除了31个模块,并添加了两个。

首先,删除了java.se.ee聚合器模块。 它引用了Java SE的六个模块,因此已从Java SE 11规范中删除。 聚合器模块和两个相关的jdk特定模块不是Java SE规范的一部分。 JEP 320描述了对JDK的完整更改。

  • 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孵化器模块(在JDK 9中引入)已被删除,并已被Java SE标准的一部分所取代。 JEP 110JEP 321和Java SE 11规范对此进行了描述。

  • 将jdk.incubator.httpclient替换为java.net.http

JavaFX的模块。 如前所述,尽管JavaFX是更广泛的OpenJDK项目的一部分,但这些模块仅包含在Oracle JDK中。 被宣布撤职的新闻在这里宣布。

  • javafx.base
  • javafx.controls
  • javafx.deploy
  • javafx.fxml
  • javafx.graphics
  • javafx.media
  • javafx.swing
  • javafx.web

相关Java打包程序有两个特定于JDK的模块。

  • jdk.packager
  • jdk.packager.services

还请参见: Dagger:使用此依赖性注入器为Java和Android实现完整堆​​栈

浏览器插件和Java Web Start模块。 这些功能的删除已在此处公开 这里的模块主要是特定于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特有的,因为它包含在名称中。 似乎因为这些是台式机和Net模块,所以为它们加上了oracle而不是jdk前缀,以防止混淆。

  • oracle.desktop(Oracle AWT实用程序)
  • oracle.net(SDP和NIO Oracle的补充)

最后,我们还有其他三个Oracle特定的模块。 在这些情况下,除JDK 10文档声明已弃用这些功能外,似乎没有宣布删除这些功能。 令我有些惊讶的是,没有在某处宣布取消SNMP支持(如果我错了,请更正我,但是标准搜索没有显示任何内容)。

  • jdk.management.resource(资源管理)
  • jdk.management.cmm(合作内存管理)
  • jdk.snmp(SNMP支持)

至少从JDK 11开始,维恩图缩小到只有两个圆圈:OpenJDK和Java SE。

我们如何定义Java?

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

注意:这篇文章已经从其原始形式进行了更新,以更正一些勘误并添加说明。

This post was originally published on the Azul Systems blog.

翻译自: https://jaxenter.com/define-java-146025.html