openJDK 版本号 - 这些是宏吗?:$MAJOR.$MINOR.$SECURITY。这些是如何访问的?

openJDK version numbers - Are these macros?: $MAJOR.$MINOR.$SECURITY. How are these accessed?

this link 处讨论了版本号。那里或我发现的任何其他地方都没有解释这些看起来很宏观的东西是什么。例如,在什么情况下使用“$VNUM”?它的范围是什么?它是在 openJDK 编译期间使用的 C++ 头文件中定义的吗?可以从我的 java 程序中访问它吗?它是某种环境变量吗?

感谢您的解释。

$ 后跟名称是在 Unix shell 脚本和命令行提示符中使用变量的标准方法。您链接到的 JEP 实际上并不是指 Unix 命令,而是使用该语法来指示某些值的排列方式。

如果您现在在 Linux 或 OS X 中打开终端,您可以输入如下内容以查看变量替换的工作原理:

MAJOR=11
MINOR=0
SECURITY=3
echo $MAJOR.$MINOR.$SECURITY

作者本可以使用 Java 语法来描述它,例如 major + "." + minor + "." + security,或者可以使用类似 BNF 的符号来描述它,但他选择了这样做。

版本元素由 Runtime.Version class. You can obtain an instance for the currently running JVM using the Runtime.version() 方法的实例使用。

为什么要看?解决特定版本中的已知错误,或在可用时使用更新的 API。

如果您想获得 JEP 描述为 $VNUM 的值,您可以这样写:

String vnum = Runtime.version().version().stream().map(Object::toString).collect(
    Collectors.joining("."));

…将 major/minor/security 数字(实际上不再叫它)与中间的句点连接起来。

但是,通常您不需要该字符串。您更有可能比较版本,以测试特定错误或功能:

Runtime.Version requiredVersion = Runtime.Version.parse("11");

if (Runtime.version().compareTo(requiredVersion) < 0) {
    System.err.println("This program requires Java 11 or later.");
    System.exit(1);
}