From 3e5fac4df6f93b28ff96178648f794f1b925377c Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sat, 29 May 2021 16:50:07 +0800 Subject: [PATCH] feat: lookup JRE installation in more places. --- .../hmcl/util/platform/JavaVersion.java | 68 ++++++++++++------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java index 0d089adad..328768165 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java @@ -184,7 +184,7 @@ public final class JavaVersion { List javaVersions; - try (Stream stream = searchPotentialJavaHomes()) { + try (Stream stream = searchPotentialJavaExecutables()) { javaVersions = lookupJavas(stream); } catch (IOException e) { LOG.log(Level.WARNING, "Failed to search Java homes", e); @@ -201,10 +201,8 @@ public final class JavaVersion { LATCH.countDown(); } - private static List lookupJavas(Stream javaHomes) { - return javaHomes - .filter(Files::isDirectory) - .map(JavaVersion::getExecutable) + private static List lookupJavas(Stream javaExecutables) { + return javaExecutables .filter(Files::isExecutable) .flatMap(executable -> { // resolve symbolic links try { @@ -229,34 +227,56 @@ public final class JavaVersion { .collect(toList()); } - private static Stream searchPotentialJavaHomes() throws IOException { + private static Stream searchPotentialJavaExecutables() throws IOException { + List> javaExecutables = new ArrayList<>(); switch (OperatingSystem.CURRENT_OS) { case WINDOWS: - List locations = new ArrayList<>(); - locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\")); - locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\")); - locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\")); - locations.addAll(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\")); - return locations.stream(); + javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\").stream().map(JavaVersion::getExecutable)); + javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\").stream().map(JavaVersion::getExecutable)); + javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\").stream().map(JavaVersion::getExecutable)); + javaExecutables.add(queryJavaHomesInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\").stream().map(JavaVersion::getExecutable)); + javaExecutables.add(listDirectory(Paths.get("C:\\Program Files\\Java")).map(JavaVersion::getExecutable)); + 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: - Path linuxJvmDir = Paths.get("/usr/lib/jvm"); - if (Files.isDirectory(linuxJvmDir)) { - return Files.list(linuxJvmDir); - } - return Stream.empty(); + javaExecutables.add(listDirectory(Paths.get("/usr/lib/jvm")).map(JavaVersion::getExecutable)); + javaExecutables.add(listDirectory(Paths.get("/usr/lib32/jvm")).map(JavaVersion::getExecutable)); + javaExecutables.add(Arrays.stream(System.getenv("PATH").split(":")).map(path -> Paths.get(path, "java"))); + break; case OSX: - Path osxJvmDir = Paths.get("/Library/Java/JavaVirtualMachines"); - if (Files.isDirectory(osxJvmDir)) { - return Files.list(osxJvmDir) - .map(dir -> dir.resolve("Contents/Home")); - } - return Stream.empty(); + javaExecutables.add(listDirectory(Paths.get("/Library/Java/JavaVirtualMachines")) + .flatMap(dir -> Stream.of(dir.resolve("Contents/Home"), dir.resolve("Contents/Home/jre"))) + .map(JavaVersion::getExecutable)); + javaExecutables.add(listDirectory(Paths.get("/System/Library/Java/JavaVirtualMachines")) + .map(dir -> dir.resolve("Contents/Home")) + .map(JavaVersion::getExecutable)); + javaExecutables.add(Arrays.stream(System.getenv("PATH").split(":")).map(path -> Paths.get(path, "java"))); + break; default: - return Stream.empty(); + break; + } + return javaExecutables.stream().flatMap(stream -> stream); + } + + private static Stream listDirectory(Path directory) throws IOException { + if (Files.isDirectory(directory)) { + return Files.list(directory); + } else { + return Stream.empty(); } }