From c38371f45432f2d232186f0fedf7a499e555c92c Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 19 Sep 2025 21:35:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20Java=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=A7=84=E5=88=99=20(#4515)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/java/JavaManager.java | 31 +++++++------------ .../hmcl/util/platform/JavaRuntimeTest.java | 1 + 2 files changed, 12 insertions(+), 20 deletions(-) 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"));