Java 9 的版本字符串方案中的第 4 个数字是啥意思?

Posted

技术标签:

【中文标题】Java 9 的版本字符串方案中的第 4 个数字是啥意思?【英文标题】:What does the 4th number mean in Java 9's version string scheme?Java 9 的版本字符串方案中的第 4 个数字是什么意思? 【发布时间】:2018-04-19 17:48:09 【问题描述】:

根据 Java 9 的新版本字符串方案中的this blog,版本应该类似于MAJOR.MINOR.SECURITY,即中间应该有 3 个数字和 2 个句点。

但是,使用 Azul 的 Zulu 9,当我打印 Java 版本时,它有 4 个数字和 3 个句点:

./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)

这4个数字代表什么?

【问题讨论】:

请注意,这可能会在未来再次发生变化。也许不是模式而是语义。 mail.openjdk.java.net/pipermail/discuss/2017-September/… 【参考方案1】:

那篇博文有点过时了。 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 - 安全级别,针对包含关键修复程序(包括提高安全性所必需的修复程序)的安全更新版本而增加。当$MINOR 增加时,$SECURITY 不会重置为零。因此,对于给定的$MAJOR 值,$SECURITY 的值越高,总是表示发布越安全,而不管$MINOR 的值如何。

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

【讨论】:

@JAB 他们确实这样做了,但不是字面意思。语义版本控制允许在前 3 个标签 Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. 之后进行扩展。就是这样。 他们的首席架构师刚刚提出了 Java 版本号 change to be the release date,所以我们最终会得到一些 看起来 像语义版本控制的东西,但实际上只是增加得非常快,所以它看起来“先进”和“进步”以及其他营销缺陷。 @Ordous Semver part 7: “[...] 当次要版本增加时,补丁版本必须重置为 0。”当增加 $MINOR 数字时,JEP 明确重置 $SECURITY 数字。【参考方案2】:

也就是说,中间应该有 3 个数字和 2 个句点。

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

除了由@Stephen 在other answer 中链接的 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

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

并可进一步用于(主要)获取(runtime) version 的主要、次要、预发布和安全号等信息。

【讨论】:

以上是关于Java 9 的版本字符串方案中的第 4 个数字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

js正则知识点

带有条件的java中的正则表达式

一个java问题,随机输入一组数字,从小到大排列,然后表示它是第几次输入的数字(问题在这),真心求助。

Java:如何用第十个指数格式化字符串数字

JAVA如何提取字符串中的第1个字符

搜索 2 个特定字母后跟 4 个数字 Regex