JEP 223:新版本字符串方案
概括
定义一个版本字符串方案,可以轻松区分主要版本、次要版本和安全更新版本,并将其应用到 JDK。
目标
-
易于人类理解,易于程序解析。
-
与当前的行业实践保持一致,特别是语义版本控制。
-
可供现有的打包系统和平台部署机制采用,包括RPM、dpkg、IPS和Java 网络启动协议 (JNLP)。
-
消除当前将两种类型的信息编码在版本字符串的一个元素中的做法,即,次要版本号和安全级别,这种做法难以破译并导致跳过许多版本号。
-
提供简单的 API 用于版本字符串解析、验证和比较。
非目标
- 更改此 JEP 目标版本之前的任何版本使用的版本字符串格式。
动机
哪个版本包含所有最新的安全修复程序:JDK 7 Update 55 还是 JDK 7 Update 60?
看起来 JDK 7 Update 60 比 Update 55 晚了五个版本,因此它必须包含更多安全修复程序,对吗?
遗憾的是,这个结论是不正确的:这两个版本都包含完全相同的安全修复程序。要理解这个答案,您首先需要了解JDK 更新版本的当前编号方案。包含安全修复之外的更改的次要版本是 20 的倍数。基于先前次要版本的安全版本是奇数,增加 5,或在必要时增加 6,以保持更新编号为奇数。要了解次要版本是否实际上比早期版本更安全,最终需要查看发行说明或源代码。
名为“JDK 7 Update 60”、“1.7.0_60”和“JDK 7u60”的版本之间有什么区别?
这些只是同一版本的不同名称。这些差异使得识别和验证等效版本变得困难。对已解析标记序列进行简单的逐点比较是不够的;相反,需要相当复杂的算法。小写“u”的使用不是行业标准,也不是语言中立的。
更简单、更直观的版本控制方案已经过去很久了。
描述
版本号
_版本号_是由$VNUM
句点字符 (U+002E) 分隔的非空元素序列。元素要么为零,要么是不带前导零的无符号整数。版本号中的最后一个元素不得为零。格式为:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*
该序列可以是任意长度,但前三个元素被赋予特定含义,如下所示:
$MAJOR.$MINOR.$SECURITY
-
$MAJOR
--- 主要版本号,对于包含 Java SE 平台规范新版本中指定的重要新功能的主要版本递增,例如, Java SE 8 的JSR 337。在给定的情况下,功能可能会在主要版本中删除提前通知至少一个主要版本,并且在合理的情况下可以进行不兼容的更改。$MAJOR
JDK 8 的版本号是8
;$MAJOR
JDK 9 的版本号是9
。当$MAJOR
递增时,所有后续元素都将被删除。 -
$MINOR
--- 次要版本号,针对次要更新版本递增,该次要更新版本可能包含兼容的错误修复、相关平台规范的维护版本强制要求的标准 API 的修订以及该规范范围之外的实现功能,例如新的 JDK -特定的 API、额外的服务提供程序、新的垃圾收集器以及新硬件架构的端口。 -
$SECURITY
--- 安全级别,针对包含关键修复(包括提高安全性所需的修复)的安全更新版本而增加。递增时$SECURITY
不会重置为零。因此,对于给定值,$MINOR
较高的 值始终表示更安全的发布,无论 的值如何。$SECURITY``$MAJOR``$MINOR
版本号的第四个及后面的元素可供 JDK 代码库的下游消费者免费使用。这样的消费者可以_例如_使用第四元素来识别除了相应安全版本中的安全修复之外还包含少量关键非安全修复的补丁版本。
版本号不包含尾随零元素;即,$SECURITY
如果它的值为零,则被省略;$MINOR
如果$MINOR
和$SECURITY