feat: lookup JRE installation in more places.

This commit is contained in:
huanghongxun 2021-05-29 16:50:07 +08:00
parent e63fa40822
commit 3e5fac4df6

View File

@ -184,7 +184,7 @@ public final class JavaVersion {
List<JavaVersion> javaVersions; List<JavaVersion> javaVersions;
try (Stream<Path> stream = searchPotentialJavaHomes()) { try (Stream<Path> stream = searchPotentialJavaExecutables()) {
javaVersions = lookupJavas(stream); javaVersions = lookupJavas(stream);
} catch (IOException e) { } catch (IOException e) {
LOG.log(Level.WARNING, "Failed to search Java homes", e); LOG.log(Level.WARNING, "Failed to search Java homes", e);
@ -201,10 +201,8 @@ public final class JavaVersion {
LATCH.countDown(); LATCH.countDown();
} }
private static List<JavaVersion> lookupJavas(Stream<Path> javaHomes) { private static List<JavaVersion> lookupJavas(Stream<Path> javaExecutables) {
return javaHomes return javaExecutables
.filter(Files::isDirectory)
.map(JavaVersion::getExecutable)
.filter(Files::isExecutable) .filter(Files::isExecutable)
.flatMap(executable -> { // resolve symbolic links .flatMap(executable -> { // resolve symbolic links
try { try {
@ -229,34 +227,56 @@ public final class JavaVersion {
.collect(toList()); .collect(toList());
} }
private static Stream<Path> searchPotentialJavaHomes() throws IOException { private static Stream<Path> searchPotentialJavaExecutables() throws IOException {
List<Stream<Path>> javaExecutables = new ArrayList<>();
switch (OperatingSystem.CURRENT_OS) { switch (OperatingSystem.CURRENT_OS) {
case WINDOWS: case WINDOWS:
List<Path> locations = new ArrayList<>(); javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\").stream().map(JavaVersion::getExecutable));
locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\")); javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\").stream().map(JavaVersion::getExecutable));
locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\")); javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\").stream().map(JavaVersion::getExecutable));
locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\")); javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\").stream().map(JavaVersion::getExecutable));
locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\")); javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\Java")).map(JavaVersion::getExecutable));
return locations.stream(); javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\BellSoft")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\AdoptOpenJDK")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\Zulu")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\Microsoft")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files (x86)\\Java")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files (x86)\\BellSoft")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files (x86)\\AdoptOpenJDK")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files (x86)\\Zulu")).map(JavaVersion::getExecutable));
javaExecutables.add(listDirectory(Paths.get("C:\\Program Files (x86)\\Microsoft")).map(JavaVersion::getExecutable));
javaExecutables.add(Arrays.stream(System.getenv("PATH").split(";")).map(path -> Paths.get(path, "java.exe")));
javaExecutables.add(Arrays.stream(System.getenv("PATH").split(";")).map(path -> Paths.get(path, "java.exe")));
break;
case LINUX: case LINUX:
Path linuxJvmDir = Paths.get("/usr/lib/jvm"); javaExecutables.add(listDirectory(Paths.get("/usr/lib/jvm")).map(JavaVersion::getExecutable));
if (Files.isDirectory(linuxJvmDir)) { javaExecutables.add(listDirectory(Paths.get("/usr/lib32/jvm")).map(JavaVersion::getExecutable));
return Files.list(linuxJvmDir); javaExecutables.add(Arrays.stream(System.getenv("PATH").split(":")).map(path -> Paths.get(path, "java")));
} break;
return Stream.empty();
case OSX: case OSX:
Path osxJvmDir = Paths.get("/Library/Java/JavaVirtualMachines"); javaExecutables.add(listDirectory(Paths.get("/Library/Java/JavaVirtualMachines"))
if (Files.isDirectory(osxJvmDir)) { .flatMap(dir -> Stream.of(dir.resolve("Contents/Home"), dir.resolve("Contents/Home/jre")))
return Files.list(osxJvmDir) .map(JavaVersion::getExecutable));
.map(dir -> dir.resolve("Contents/Home")); javaExecutables.add(listDirectory(Paths.get("/System/Library/Java/JavaVirtualMachines"))
} .map(dir -> dir.resolve("Contents/Home"))
return Stream.empty(); .map(JavaVersion::getExecutable));
javaExecutables.add(Arrays.stream(System.getenv("PATH").split(":")).map(path -> Paths.get(path, "java")));
break;
default: default:
return Stream.empty(); break;
}
return javaExecutables.stream().flatMap(stream -> stream);
}
private static Stream<Path> listDirectory(Path directory) throws IOException {
if (Files.isDirectory(directory)) {
return Files.list(directory);
} else {
return Stream.empty();
} }
} }