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

时间:2018-12-12 12:08:35

标签: java version

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

在安装过程中,用户必须定义​​他后来要在应用程序运行时使用的 Java的家的路径。这可能是我的安装程序当前正在运行的JRE之外的另一个JRE,也不一定是wordnet路径。

因此,要获取实际应用程序应在其中运行的用户定义的 target Java 的版本,我不能简单地在安装程序代码中调用JAVA_HOME,因为这会为我提供JRE的版本当前正在运行安装程序

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

2 个答案:

答案 0 :(得分:2)

如果您具有Java的安装目录,则可以阅读“发行”文件。

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

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"

enter image description here

答案 1 :(得分:1)

好的,在阅读您的评论后,我编写了执行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");