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