如何以编程方式获取任何给定 java 路径的 Java 版本?

How to get Java version of any given java path programmatically?

我有一个应用程序和这个应用程序的安装程序,都是用 Java 编写的。

在安装过程中,用户必须定义​​ Java 主页 的路径,他以后想在 运行 时使用该应用程序.这可能是另一个 JRE,而不是我的安装程序当前 运行 的 JRE,也不一定必须是 JAVA_HOME 路径。

因此,要获取用户定义的 目标 Java 实际应用程序应 运行 的版本,我不能简单地调用 System.getProperty("java.runtime.version") 在我的安装程序代码中,因为这为我提供了当前 运行 宁 安装程序 .

的 JRE 版本

当我只有 JRE 的路径时,是否有任何通用方法以编程方式获取 JRE 的 Java 版本?也许有一个单独的 class 装载机?或者阅读任何 META-INF 或阅读该 JRE 库中的任何 class?

好的,在阅读了您的评论后,我已经编写了执行 java -version

的代码
ProcessBuilder pb = new ProcessBuilder("java", "-version");
pb.directory(new File(System.getProperty("user.home")));
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String javaVersion = reader.readLine();
System.out.println(javaVersion.substring(javaVersion.indexOf("\"") + 1, javaVersion.lastIndexOf("\"")));

您也可以使用精确路径调用它

ProcessBuilder pb = new ProcessBuilder("C:\Program Files\Java\jdk1.8.0_181\bin\java", "-version");

这会将 java 版本输出为 1.8.0_181

感谢 Andreas Hauschild 指出 release 文件包含版本 我编写了代码来解析该文件的版本,因此请使用它。如果你不想执行命令并想从 release 文件中获取 java 版本,我写了一个代码来解析它的版本

public static String getJavaVersion(String javaPath) throws IOException {
    File releaseFile = new File(javaPath, "release");
    BufferedReader bufferedReader = new BufferedReader(new FileReader(releaseFile));
    String version = bufferedReader.readLine();
    return version.substring(version.indexOf("\"") + 1, version.lastIndexOf("\""));
}

您可以使用

调用它
String version = getJavaVersion("C:\Program Files\Java\jdk1.8.0_181");

如果您有 Java 的安装目录,您可以阅读 "release" 文件。

位于安装根目录(例):

C:\Program Files\Java\jre1.8.0_191\release
C:\Program Files (x86)\Java\jre1.8.0_191\release

内容如下:

JAVA_VERSION="1.8.0_191"
OS_NAME="Windows"
OS_VERSION="5.2"
OS_ARCH="amd64"