Fix launching older Forge versions (#3920)

This commit is contained in:
Josiah Glosson 2025-07-06 14:09:49 -05:00 committed by GitHub
parent e5b134f8f4
commit 31ecace083
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 2 deletions

View File

@ -2,6 +2,7 @@ package com.modrinth.theseus;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;
@ -76,14 +77,14 @@ public final class MinecraftLaunch {
Object thisObject = null; Object thisObject = null;
if (!Modifier.isStatic(mainMethod.getModifiers())) { if (!Modifier.isStatic(mainMethod.getModifiers())) {
thisObject = mainClass.getDeclaredConstructor().newInstance(); thisObject = forceAccessible(mainClass.getDeclaredConstructor()).newInstance();
} }
final Object[] parameters = mainMethod.getParameterCount() > 0 ? new Object[] {args} : new Object[] {}; final Object[] parameters = mainMethod.getParameterCount() > 0 ? new Object[] {args} : new Object[] {};
mainMethod.invoke(thisObject, parameters); mainMethod.invoke(thisObject, parameters);
} else { } else {
findSimpleMainMethod(mainClass).invoke(null, new Object[] {args}); forceAccessible(findSimpleMainMethod(mainClass)).invoke(null, new Object[] {args});
} }
} }
@ -115,4 +116,11 @@ public final class MinecraftLaunch {
private static Method findSimpleMainMethod(Class<?> mainClass) throws NoSuchMethodException { private static Method findSimpleMainMethod(Class<?> mainClass) throws NoSuchMethodException {
return mainClass.getMethod("main", String[].class); return mainClass.getMethod("main", String[].class);
} }
private static <T extends AccessibleObject> T forceAccessible(T object) throws ReflectiveOperationException {
final Method setAccessible0 = AccessibleObject.class.getDeclaredMethod("setAccessible0", boolean.class);
setAccessible0.setAccessible(true);
setAccessible0.invoke(object, true);
return object;
}
} }

View File

@ -619,6 +619,12 @@ pub async fn launch_minecraft(
.into_iter(), .into_iter(),
); );
// The java launcher requires access to java.lang.reflect in order to force access in to
// whatever module the main class is in
if java_version.parsed_version >= 9 {
command.arg("--add-opens=java.base/java.lang.reflect=ALL-UNNAMED");
}
// The java launcher code requires internal JDK code in Java 25+ in order to support JEP 512 // The java launcher code requires internal JDK code in Java 25+ in order to support JEP 512
if java_version.parsed_version >= 25 { if java_version.parsed_version >= 25 {
command.arg("--add-opens=jdk.internal/jdk.internal.misc=ALL-UNNAMED"); command.arg("--add-opens=jdk.internal/jdk.internal.misc=ALL-UNNAMED");