我有一个应用程序和该应用程序的安装程序,都用Java编写。
在安装过程中,用户必须定义他后来要在应用程序运行时使用的 Java的家的路径。这可能是我的安装程序当前正在运行的JRE之外的另一个JRE,也不一定是wordnet
路径。
因此,要获取实际应用程序应在其中运行的用户定义的 target Java 的版本,我不能简单地在安装程序代码中调用JAVA_HOME
,因为这会为我提供JRE的版本当前正在运行安装程序。
当我只有JRE的路径时,是否有任何常用的方法以编程方式获取JRE的Java版本?也许有一个单独的类加载器?还是阅读任何META-INF或阅读该JRE库中的任何类?
答案 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"
答案 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");