diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java index 215935258..4fa82750b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/java/JavaManager.java @@ -264,16 +264,15 @@ public final class JavaManager { } } - private static int compareJavaVersion(JavaRuntime java1, JavaRuntime java2, GameJavaVersion suggestedJavaVersion) { - if (suggestedJavaVersion != null) { - boolean b1 = java1.getParsedVersion() == suggestedJavaVersion.getMajorVersion(); - boolean b2 = java2.getParsedVersion() == suggestedJavaVersion.getMajorVersion(); + private static JavaRuntime chooseJava(@Nullable JavaRuntime java1, JavaRuntime java2) { + if (java1 == null) + return java2; - if (b1 != b2) - return b1 ? 1 : -1; - } - - return java1.getVersionNumber().compareTo(java2.getVersionNumber()); + if (java1.getParsedVersion() != java2.getParsedVersion()) + // Prefer the Java version that is closer to the game's recommended Java version + return java1.getParsedVersion() < java2.getParsedVersion() ? java1 : java2; + else + return java1.getVersionNumber().compareTo(java2.getVersionNumber()) >= 0 ? java1 : java2; } @Nullable @@ -289,9 +288,6 @@ public final class JavaManager { && (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS || OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) && (gameVersion == null || gameVersion.compareTo("1.6") < 0); - GameJavaVersion suggestedJavaVersion = - (version != null && gameVersion != null && gameVersion.compareTo("1.7.10") >= 0) ? version.getJavaVersion() : null; - JavaRuntime mandatory = null; JavaRuntime suggested = null; for (JavaRuntime java : javaRuntimes) { @@ -319,15 +315,10 @@ public final class JavaManager { } if (!violationMandatory) { - if (mandatory == null) mandatory = java; - else if (compareJavaVersion(java, mandatory, suggestedJavaVersion) > 0) - mandatory = java; + mandatory = chooseJava(mandatory, java); - if (!violationSuggested) { - if (suggested == null) suggested = java; - else if (compareJavaVersion(java, suggested, suggestedJavaVersion) > 0) - suggested = java; - } + if (!violationSuggested) + suggested = chooseJava(suggested, java); } } diff --git a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java index a4b2c9c87..6de2c888d 100644 --- a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java +++ b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java @@ -13,6 +13,7 @@ public final class JavaRuntimeTest { public void testParseVersion() { assertEquals(8, parseVersion("1.8.0_302")); assertEquals(8, parseVersion("1.8-internal")); + assertEquals(8, parseVersion("8.0")); assertEquals(11, parseVersion("11")); assertEquals(11, parseVersion("11.0.12")); assertEquals(11, parseVersion("11-internal"));