From 86c171545e8b894678b771d8512e00c0a75a64f1 Mon Sep 17 00:00:00 2001 From: 27Onion Nebell <57032603+onion108@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:28:24 +0800 Subject: [PATCH] Update version check logic to support version like "26-ea" (#4128) Co-authored-by: Glavo --- .../main/java/org/jackhuang/hmcl/Main.java | 59 +++++++++++-------- .../java/org/jackhuang/hmcl/MainTest.java | 33 +++++++---- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/HMCLBoot/src/main/java/org/jackhuang/hmcl/Main.java b/HMCLBoot/src/main/java/org/jackhuang/hmcl/Main.java index af1ef361f..073592afa 100644 --- a/HMCLBoot/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCLBoot/src/main/java/org/jackhuang/hmcl/Main.java @@ -28,40 +28,53 @@ public final class Main { private Main() { } - /** - * Check if the current Java version is compatible with HMCL. - */ - static boolean checkJavaVersion(String javaVersion) { - if (javaVersion == null) { - return false; + static int findFirstNotNumber(String str, int start) { + if (start >= str.length()) + return -1; + + char ch = str.charAt(start); + if (ch < '0' || ch > '9') + return -1; + + for (int i = start + 1; i < str.length(); i++) { + ch = str.charAt(i); + if (ch < '0' || ch > '9') + return i; } + return str.length(); + } + + static int getJavaFeatureVersion(String javaVersion) { + if (javaVersion == null) + return -1; try { - int major; - int dot = javaVersion.indexOf('.'); + int end = findFirstNotNumber(javaVersion, 0); + if (end < 0) + return -1; // No valid version number found - if (dot >= 0) { - major = Integer.parseInt(javaVersion.substring(0, dot)); - if (major == 1 && dot < javaVersion.length() - 1) { - int begin = dot + 1; - dot = javaVersion.indexOf('.', begin); + int major = Integer.parseInt(javaVersion.substring(0, end)); + if (major > 1) + return major; - major = dot > begin - ? Integer.parseInt(javaVersion.substring(begin, dot)) - : Integer.parseInt(javaVersion.substring(begin)); - } - } else { - major = Integer.parseInt(javaVersion); - } + if (major < 1) + return -1; // Invalid major version - return major >= MINIMUM_JAVA_VERSION; + // Java 1.x versions + int start = end + 1; + end = findFirstNotNumber(javaVersion, start); + + if (end < 0) + return -1; // No valid minor version found + + return Integer.parseInt(javaVersion.substring(start, end)); } catch (NumberFormatException e) { - return false; + return -1; // version number is too long } } public static void main(String[] args) throws Throwable { - if (checkJavaVersion(System.getProperty("java.version"))) { + if (getJavaFeatureVersion(System.getProperty("java.version")) >= MINIMUM_JAVA_VERSION) { EntryPoint.main(args); } else { String errorMessage = BootProperties.getResourceBundle().getString("boot.unsupported_java_version"); diff --git a/HMCLBoot/src/test/java/org/jackhuang/hmcl/MainTest.java b/HMCLBoot/src/test/java/org/jackhuang/hmcl/MainTest.java index 1fdd7f5af..b3c2893b6 100644 --- a/HMCLBoot/src/test/java/org/jackhuang/hmcl/MainTest.java +++ b/HMCLBoot/src/test/java/org/jackhuang/hmcl/MainTest.java @@ -19,21 +19,30 @@ package org.jackhuang.hmcl; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; public final class MainTest { @Test - public void testCheckJavaVersion() { - assertFalse(Main.checkJavaVersion("1.6.0")); - assertFalse(Main.checkJavaVersion("1.6.0_45")); - assertFalse(Main.checkJavaVersion("1.7.0")); - assertFalse(Main.checkJavaVersion("1.7.0_80")); - assertFalse(Main.checkJavaVersion("1.8")); - assertFalse(Main.checkJavaVersion("1.8.0_321")); + public void testGetJavaFeatureVersion() { + assertEquals(6, Main.getJavaFeatureVersion("1.6.0")); + assertEquals(6, Main.getJavaFeatureVersion("1.6.0_45")); + assertEquals(7, Main.getJavaFeatureVersion("1.7.0")); + assertEquals(7, Main.getJavaFeatureVersion("1.7.0_80")); + assertEquals(8, Main.getJavaFeatureVersion("1.8")); + assertEquals(8, Main.getJavaFeatureVersion("1.8u321")); + assertEquals(8, Main.getJavaFeatureVersion("1.8.0_321")); + assertEquals(11, Main.getJavaFeatureVersion("11")); + assertEquals(11, Main.getJavaFeatureVersion("11.0.26")); + assertEquals(21, Main.getJavaFeatureVersion("21")); + assertEquals(26, Main.getJavaFeatureVersion("26-ea")); - assertTrue(Main.checkJavaVersion("11")); - assertTrue(Main.checkJavaVersion("11.0.26")); - assertTrue(Main.checkJavaVersion("21")); + assertEquals(-1, Main.getJavaFeatureVersion(null)); + assertEquals(-1, Main.getJavaFeatureVersion("")); + assertEquals(-1, Main.getJavaFeatureVersion("0")); + assertEquals(-1, Main.getJavaFeatureVersion("0.8")); + assertEquals(-1, Main.getJavaFeatureVersion("abc")); + assertEquals(-1, Main.getJavaFeatureVersion("1.abc")); + assertEquals(-1, Main.getJavaFeatureVersion(".1")); + assertEquals(-1, Main.getJavaFeatureVersion("1111111111111111111111")); } }