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

如何以编程方式获取任何给定Java路径的Java版本?,java,version,Java,Version,我有一个应用程序和这个应用程序的安装程序,都是用Java编写的 在安装过程中,用户必须定义稍后要用于应用程序运行时的Java主路径。这可能是我的安装程序当前运行的JRE之外的另一个JRE,也不一定是JAVA\u HOME路径 因此,为了获得实际应用程序应该运行的用户定义的目标Java的版本,我不能简单地在我的安装程序代码中调用System.getProperty(“Java.runtime.version”),因为这给了我当前运行安装程序的JRE的版本 当我只有JRE的路径时,是否有任何通用的方

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

在安装过程中,用户必须定义稍后要用于应用程序运行时的Java主路径。这可能是我的安装程序当前运行的JRE之外的另一个JRE,也不一定是
JAVA\u HOME
路径

因此,为了获得实际应用程序应该运行的用户定义的目标Java的版本,我不能简单地在我的安装程序代码中调用
System.getProperty(“Java.runtime.version”)
,因为这给了我当前运行安装程序的JRE的版本


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

好的,在阅读您的评论之后,我已经编写了执行
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
文件中获取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-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
文件中获取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”文件

它位于安装的根目录中(例如):

内容如下所示:

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

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

它位于安装的根目录中(例如):

内容如下所示:

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

一个选项是使用
ProcessBuilder
并使用
-version
运行java进程,然后解析输出…一个选项是使用
ProcessBuilder
并使用
-version
运行java进程,然后解析输出…这是一个很好的提示。但在我的情况下,我没有任何本地JRE中的“发布”文件。。。它是从哪里来的?编辑:啊,对不起,我查了我的JDK的JRE。在这种情况下,发布文件位于JDK的目录中。好的,这可能是我的答案。我在linux上交叉检查了它,它也在我提到的地方。为什么要否决这个答案?我想有些人不明白,你不能只调用“java-version”,因为它只返回在java\u HOME/PATH下设置的版本。我会在调用系统命令之前读取文件。是的,我知道,如果不允许安装用户执行该文件(例如Linux)?您的方法也是正确的,但是读取文件可能更容易执行java.sh/exe,这是一个很好的提示。但在我的情况下,我没有任何本地JRE中的“发布”文件。。。它是从哪里来的?编辑:啊,对不起,我查了我的JDK的JRE。在这种情况下,发布文件位于JDK的目录中。好的,这可能是我的答案。我在linux上交叉检查了它,它也在我提到的地方。为什么要否决这个答案?我想有些人不明白,你不能只调用“java-version”,因为它只返回在java\u HOME/PATH下设置的版本。我会在调用系统命令之前读取文件。是的,我知道,如果不允许安装用户执行该文件(例如Linux)?您的方法也是正确的,但是读取文件可能更容易执行java.sh/exe