20

According to this blog on Java 9's new version string scheme, the version is supposed to be like MAJOR.MINOR.SECURITY, i.e., there are supposed to be 3 numbers and 2 periods in between.

However, with Azul's Zulu 9, when I print the Java version, it has 4 numbers and 3 periods:

./jdk/bin/java -version
openjdk version "9.0.0.15"
OpenJDK Runtime Environment (Zulu build 9.0.0.15+181)
OpenJDK 64-Bit Server VM (Zulu build 9.0.0.15+181, mixed mode)

What do the 4 numbers represent ?

4

2 回答 2

24

那篇博文有点过时了。Java 9 中实际实现的方案记录在JEP 223: New Version-String Scheme

前三个数字的含义是标准化的。第 4 个和(任何)后续数字的含义由供应商指定。

还要注意第二个和第三个数字之间的有趣关系。

以下是 JEP 的相关部分。

“序列可以是任意长度,但前三个元素被赋予了特定的含义,如下所示:

$MAJOR.$MINOR.$SECURITY

$MAJOR- 主要版本号,对于包含 Java SE 平台规范新版本中指定的重要新功能的主要版本增加,例如 Java SE 8 的 JSR 337。在提前通知的情况下,功能可能会在主要版本中删除至少提前发布一个主要版本,并且在合理的情况下可能会进行不兼容的更改。JDK 8的$MAJOR版本号为8;JDK 9的$MAJOR版本号是 9。当$MAJOR增加时,所有后续元素都被删除。

$MINOR- 次要版本号,对于可能包含兼容错误修复的次要更新版本增加,相关平台规范的维护版本要求的标准 API 修订,以及该规范范围之外的实现功能,例如新的 JDK 特定 API 、额外的服务提供者、新的垃圾收集器和新硬件架构的端口。

$SECURITY- 安全级别,针对包含关键修复(包括提高安全性所需的修复)的安全更新版本而增加。$SECURITY增加时不会重置为零$MINOR$SECURITY因此,对于给定值,较高的值$MAJOR始终表示更安全的发布,而与 的值无关$MINOR

版本号的第四个和后面的元素可供 JDK 代码库的下游消费者免费使用。这样的消费者可以例如使用第四元素来识别补丁版本,这些补丁版本除了对应的安全版本中的安全修复之外还包含少量关键的非安全修复。

于 2017-11-07T11:04:43.677 回答
8

即,应该有 3 个数字和 2 个句点之间。

不一定,您可以使用 JDK 本身验证版本,如下所述。

除了 @Stephen 在另一个答案中链接的 JEP之外,JDK 中还有一个 API 附加项Runtime.Version,可用于验证给定的版本字符串。这可以使用示例存根来完成:

[我想知道在这里使用 JShell 会很有趣,没有 IDE!]

Runtime.Version version = Runtime.Version.parse("9");
version = Runtime.Version.parse("9.0.1");
version = Runtime.Version.parse("9.0.0.15");
version = Runtime.Version.parse("9.0.0.15+181");

该代码利用Version.parse

将给定字符串解析为包含版本号的有效版本字符串,后跟预发布和构建信息。

并且可以进一步用于(主要)获取(运行时)版本的主要、次要、预发布和安全号等信息。

于 2017-11-07T10:51:14.753 回答