Update version check logic to support version like "26-ea" (#4128)

Co-authored-by: Glavo <zjx001202@gmail.com>
This commit is contained in:
27Onion Nebell 2025-07-29 17:28:24 +08:00 committed by GitHub
parent c3a3881cfc
commit 86c171545e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 57 additions and 35 deletions

View File

@ -28,40 +28,53 @@ public final class Main {
private Main() { private Main() {
} }
/** static int findFirstNotNumber(String str, int start) {
* Check if the current Java version is compatible with HMCL. if (start >= str.length())
*/ return -1;
static boolean checkJavaVersion(String javaVersion) {
if (javaVersion == null) { char ch = str.charAt(start);
return false; 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 { try {
int major; int end = findFirstNotNumber(javaVersion, 0);
int dot = javaVersion.indexOf('.'); if (end < 0)
return -1; // No valid version number found
if (dot >= 0) { int major = Integer.parseInt(javaVersion.substring(0, end));
major = Integer.parseInt(javaVersion.substring(0, dot)); if (major > 1)
if (major == 1 && dot < javaVersion.length() - 1) { return major;
int begin = dot + 1;
dot = javaVersion.indexOf('.', begin);
major = dot > begin if (major < 1)
? Integer.parseInt(javaVersion.substring(begin, dot)) return -1; // Invalid major version
: Integer.parseInt(javaVersion.substring(begin));
}
} else {
major = Integer.parseInt(javaVersion);
}
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) { } catch (NumberFormatException e) {
return false; return -1; // version number is too long
} }
} }
public static void main(String[] args) throws Throwable { 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); EntryPoint.main(args);
} else { } else {
String errorMessage = BootProperties.getResourceBundle().getString("boot.unsupported_java_version"); String errorMessage = BootProperties.getResourceBundle().getString("boot.unsupported_java_version");

View File

@ -19,21 +19,30 @@ package org.jackhuang.hmcl;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
public final class MainTest { public final class MainTest {
@Test @Test
public void testCheckJavaVersion() { public void testGetJavaFeatureVersion() {
assertFalse(Main.checkJavaVersion("1.6.0")); assertEquals(6, Main.getJavaFeatureVersion("1.6.0"));
assertFalse(Main.checkJavaVersion("1.6.0_45")); assertEquals(6, Main.getJavaFeatureVersion("1.6.0_45"));
assertFalse(Main.checkJavaVersion("1.7.0")); assertEquals(7, Main.getJavaFeatureVersion("1.7.0"));
assertFalse(Main.checkJavaVersion("1.7.0_80")); assertEquals(7, Main.getJavaFeatureVersion("1.7.0_80"));
assertFalse(Main.checkJavaVersion("1.8")); assertEquals(8, Main.getJavaFeatureVersion("1.8"));
assertFalse(Main.checkJavaVersion("1.8.0_321")); 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")); assertEquals(-1, Main.getJavaFeatureVersion(null));
assertTrue(Main.checkJavaVersion("11.0.26")); assertEquals(-1, Main.getJavaFeatureVersion(""));
assertTrue(Main.checkJavaVersion("21")); 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"));
} }
} }