From e376da208d6f202fcce088a7dd4d048df254c9bb Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Tue, 14 Aug 2018 10:44:24 +0800 Subject: [PATCH] Fix duplicate JavaVersions in Windows. Closes #419 --- .../org/jackhuang/hmcl/util/JavaVersion.java | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java index 4a053d075..10069c8e8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java @@ -25,7 +25,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.logging.Level; import java.util.regex.Matcher; @@ -67,7 +66,8 @@ public final class JavaVersion { /** * The major version of Java installation. * - * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_X + * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_11 + * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_10 * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_9 * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_8 * @see org.jackhuang.hmcl.util.JavaVersion#JAVA_7 @@ -154,10 +154,6 @@ public final class JavaVersion { private static List JAVAS; private static final CountDownLatch LATCH = new CountDownLatch(1); - public static Optional> getJREsImmediately() { - return Optional.ofNullable(JAVAS); - } - public static List getJREs() throws InterruptedException { if (JAVAS != null) return JAVAS; @@ -242,13 +238,25 @@ public final class JavaVersion { // ==== Windows ==== private static List queryWindows() { List res = new ArrayList<>(); - Lang.ignoringException(() -> res.addAll(queryRegisterKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\"))); - Lang.ignoringException(() -> res.addAll(queryRegisterKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\"))); - Lang.ignoringException(() -> res.addAll(queryRegisterKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\"))); - Lang.ignoringException(() -> res.addAll(queryRegisterKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\"))); + Lang.ignoringException(() -> res.addAll(queryJavaInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\"))); + Lang.ignoringException(() -> res.addAll(queryJavaInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\"))); + Lang.ignoringException(() -> res.addAll(queryJavaInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JRE\\"))); + Lang.ignoringException(() -> res.addAll(queryJavaInRegistryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\JDK\\"))); return res; } + private static List queryJavaInRegistryKey(String location) throws IOException, InterruptedException { + List res = new ArrayList<>(); + for (String java : querySubFolders(location)) { + if (!querySubFolders(java).contains(java + "\\MSI")) continue; + String home = queryRegisterValue(java, "JavaHome"); + if (home != null) + res.add(fromJavaHome(new File(home))); + } + return res; + } + + // Registry utilities private static List querySubFolders(String location) throws IOException, InterruptedException { List res = new ArrayList<>(); String[] cmd = new String[] { "cmd", "/c", "reg", "query", location }; @@ -263,16 +271,6 @@ public final class JavaVersion { return res; } - private static List queryRegisterKey(String location) throws IOException, InterruptedException { - List res = new ArrayList<>(); - for (String java : querySubFolders(location)) { - String home = queryRegisterValue(java, "JavaHome"); - if (home != null) - res.add(fromJavaHome(new File(home))); - } - return res; - } - private static String queryRegisterValue(String location, String name) throws IOException, InterruptedException { String[] cmd = new String[] { "cmd", "/c", "reg", "query", location, "/v", name }; boolean last = false;