我可以假设JDK/JRE将有一个"发布"文件吗?



我试图推断安装的jdk/JREs的Java版本。我看到很多运行java -version并解析输出的代码,但这有点昂贵,而且编写起来很烦人。此外,java -version的输出不包括操作系统和体系结构等重要信息(对于现在可以支持多种体系结构的M1 mac来说尤其重要)。

我注意到在我安装的所有jdk中,有一个release文件,JAVA_VERSION="<VERSION>"行。

例如,Amazon Corretto 8有一个release文件,上面写着
cat release
JAVA_VERSION="1.8.0_322"
OS_NAME="Windows"
OS_VERSION="5.1"
OS_ARCH="i586"
SOURCE=""
LIBC=""

祖鲁语17说

IMPLEMENTOR="Azul Systems, Inc."
IMPLEMENTOR_VERSION="Zulu17.32+13-CA"
JAVA_VERSION="17.0.2"
JAVA_VERSION_DATE="2022-01-18"
LIBC="default"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.incubator.vector jdk.internal.le jdk.internal.opt jdk.internal.vm.ci jdk.internal.vm.compiler jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jlink jdk.jpackage jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
OS_ARCH="x86_64"
OS_NAME="Darwin"
SOURCE=".:git:bfa6b2cbcbf7"

我找不到JEP或任何其他文档说这个文件将永远存在,但也找不到反例。(我也找不到关于' java -version '输出格式的JEP或文档)

假设总是有一个release文件至少有一个JAVA_VERSION行是安全的吗?

我可以假设JDK/JRE将有一个"发布"吗?文件吗?

你可以假设任何你喜欢的。我们不能阻止你:-)

然而…

如果没有正式的公开文档说明"发布";如果文件存在,那么假定它存在是不安全的。我不记得有任何文档提到"发布"。文件。

(OpenJDK源代码树/构建指令中的文档不算数。这是"内部"内容,如有更改,恕不另行通知。

这并不是说该文件不存在于所有的Java版本中…或者在未来可能会改变。但是safe意味着您可以依赖它。如果没有文档,你就不能依赖它。

相比之下,虽然也没有指定java -version的输出,但至少记录了该选项。典型的输出至少是显示在Oracle网站上:

确定Mac上JDK的默认版本

通过命令行启动Java应用程序时,系统使用默认的JDK。JRE的版本可能与JDK的版本不同。

您可以通过在终端窗口中输入java -version来确定默认的JDK版本。如果安装的版本是7u55,您将看到一个包含文本1.7.0_55的字符串。例如:

java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

来源:https://www.java.com/en/download/help/version_manual.html


在给定jdk的情况下,检测Java版本、发行版、操作系统和体系结构的最安全方法是什么?

这是一个意见问题……但我的意见是,您应该编写一个从系统属性对象中读取信息的小实用程序……

使用(仅)javadoc中显式记录的属性。

我也不喜欢解析java -version的输出-如果java提供更多的机器可读输出(例如java -lookup-property java.version),那就太好了。

依赖发布文件的一个问题是,现在你的引导逻辑可能负责遍历符号链接,以找出java home/发布文件在哪里(如果你依赖于PATH系统的java)。

我创建了一个简单的库,专门用于获取属性信息(java.version,java.home等)的"正确"。方法:

java -cp utilities.jar LookupProperty <property.name>

from java_utilities import lookup_property
print(lookup_property("java.version"))

https://github.com/devinrsmith/java-utilities

Try: java -XshowSettings:properties

应该这样做:

public static void main(String[] args) {
System.out.println(System.getProperty("java.runtime.name"));
System.out.println(System.getProperty("java.runtime.version"));
System.out.println(System.getProperty("java.version.date"));
System.out.println(System.getProperty("java.specification.vendor"));
System.out.println(System.getProperty("os.name"));
}

要列出所有的属性运行java -XshowSettings查看部分属性设置或者在普通java中:

Properties properties = System.getProperties();
// Java 8
properties.forEach((k, v) -> System.out.println(k + "=" + v));

最新更新