在机器上显示所有可用的Java版本

时间:2017-04-20 12:30:42

标签: java eclipse-plugin

我正在编写一个eclipse插件,我需要显示用户计算机上安装的所有Java版本。我知道这段代码:

String javaVersion = System.getProperty("java.version");

但它只返回当前选定的Java版本。我怎么能得到它们呢?

3 个答案:

答案 0 :(得分:1)

这比你想象的要复杂得多。

当然,当你运行一些java类时;已经在单个 JVM中运行。如果您的系统上存在其他 JVM,那么JVM安装没有任何想法。

因此,它取决于您的操作系统可能位于其他JVM的位置。

在Linux系统上,您可以选择

  

find / -name" java" -type f 2> / dev / null

在我的系统上,创建输出,如:

/usr/lib/j2re1.7-ibm/jre/bin/java
/usr/lib/j2sdk1.7-ibm/jre/bin/java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-ibm-x86_64-80/jre/bin/java
/usr/share/bash-completion/completions/java
/data/home/Downloads/ibm-java-x86_64-80/jre/bin/java
...

这就是重点:用户可以将JVM二进制文件放在他的文件系统中。他可以在所有不同的目录中启动JVM。

所以真正的答案在这里:退一步;并看看你的问题背后的要求。为什么你认为你需要知道这个?从那里:你怎么能摆脱这个要求?

答案 1 :(得分:1)

您写道,您使用的是Linux,但我为寻找Mac OSX解决方案的人添加了此答案:

 /usr/libexec/java_home -V
Matching Java Virtual Machines (12):
1.8.0_131, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
1.8.0_121, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
1.8.0_112, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
1.8.0_102, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home
1.8.0_92, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home
1.8.0_77, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home
1.8.0_74, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home
1.8.0_72, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home
1.8.0_66, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home
1.8.0_65, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home
1.8.0_60, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home
1.7.0_80, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

假设已安装Oracle Java版本。

答案 2 :(得分:0)

此函数将搜索给定版本的Java,如果找不到它,它将返回null。

public static IClasspathEntry getJavaClassPath(String version) {
    IExecutionEnvironmentsManager executionEnvironmentsManager = JavaRuntime
            .getExecutionEnvironmentsManager();
    IExecutionEnvironment[] executionEnvironments = executionEnvironmentsManager
            .getExecutionEnvironments();
    for (IExecutionEnvironment iExecutionEnvironment : executionEnvironments) {
        if (version.equals(iExecutionEnvironment.getId())) {
            return JavaCore.newContainerEntry(JavaRuntime
                    .newJREContainerPath(iExecutionEnvironment));
        }
    }

    return null;
}

然后只检查您想要的版本是否存在:

private String[] getAvailableJavaVersions() {
    List<String> userJavaVersions = new ArrayList<String>();

    for(String javaVersion: Arrays.asList("1.6", "1.7", "1.8")) {
        if(MaxJProject.getJavaClassPath("JavaSE-" + javaVersion) != null) {
            userJavaVersions.add(javaVersion);
        }
    }

    return userJavaVersions.toArray(new String[userJavaVersions.size()]);
}

唯一的问题是版本列表是预先确定的。