我正在编写一个eclipse插件,我需要显示用户计算机上安装的所有Java版本。我知道这段代码:
String javaVersion = System.getProperty("java.version");
但它只返回当前选定的Java版本。我怎么能得到它们呢?
答案 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()]);
}
唯一的问题是版本列表是预先确定的。