java 我可以假设JDK/JRE有一个'release'文件吗?

a9wyjsp7  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(195)

我试图推断已安装的JDK/JRE的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或任何其他文档说明这个文件将一直存在,也找不到一个反例。(我也找不到一个JEP或文档说明'java -version的输出格式)
假设总是存在一个至少包含一行JAVA_VERSIONrelease文件是否安全?

xlpyo6sf

xlpyo6sf1#

我是否可以假定JDK/JRE将具有“release”文件?
你可以假设任何你喜欢的。我们不能阻止你:-)
可是......

  • 如果没有正式的公开文件 * 表明“发布”文件存在,那么假设它存在是不安全的。而且我不记得看到过任何提到“发布”文件的文档。

(OpenJDK源代码树/构建说明中的文档不算在内。这是“内部”文档,如有更改,恕不另行通知。)
这并不是说这个文件不是所有的Java版本都有......也不是说它 * 很可能 * 在将来会改变。但是 * 安全 * 意味着你可以依赖它。如果它没有文档化,你就不能依赖它。
相比之下,虽然java -version的输出也没有指定,但该选项至少有文档记录。典型的输出至少在Oracle网站上 * 显示 *:

确定Mac上JDK的默认版本

通过命令行启动Java应用程序时,系统使用默认JDK。JRE的版本可能与JDK的版本不同。
通过在“终端”窗口中键入java -version,可以确定哪个JDK版本是默认版本。如果安装的版本是7 u 55,则会看到一个包含文本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中明确记录的属性。

ohfgkhjo

ohfgkhjo2#

我也不喜欢解析java -version的输出--如果java提供更多机器可读的输出信息(例如java -lookup-property java.version),那就太好了。
依赖发布文件的一个问题是,现在您的引导逻辑可能负责遍历符号链接,以找出java home / release文件的位置(如果您依赖系统PATH中的java)。
我特意创建了一个简单的库,目的是以“正确”的方式获取属性信息(java.versionjava.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

相关问题