【问题标题】: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个数字代表什么?

【问题讨论】:

标签: version versioning java-9 azul-zulu


【解决方案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 的主要、次要、预发布和安全号等信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 2018-04-06
    • 2011-09-10
    • 2012-02-20
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多