若要在面向Minecraft 1.12及更早版本的ForgeGradle中使用jdk8的最新版本来运行runClient,可以执行以下步骤:
直奔TL;DR
English
jdk 8u242 から にて、runClientタスクとGradleStart classを使用した実行が以下のエラーで成功しなくなりました。
8u252にてこのエラーの原因となる変更が差し戻されたそうなので、現在は関係ありません。
[18:48:19] [main/ERROR] [LaunchWrapper]: Unable to launch
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_242]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_242]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_242]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_242]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242]
at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: java.lang.ExceptionInInitializerError
at org.lwjgl.MacOSXSysImplementation.<clinit>(MacOSXSysImplementation.java:51) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
at org.lwjgl.Sys.createImplementation(Sys.java:130) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
Exception in thread "main" at org.lwjgl.Sys.<clinit>(Sys.java:111) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
at net.minecraft.client.Minecraft.getSystemTime(Minecraft.java:3159) ~[Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:42) ~[Main.class:?]
... 12 more
Caused by: java.lang.NullPointerException
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1847) ~[?:1.8.0_242]
at java.lang.Runtime.loadLibrary0(Runtime.java:871) ~[?:1.8.0_242]
at java.lang.System.loadLibrary(System.java:1124) ~[?:1.8.0_242]
at java.awt.Toolkit$3.run(Toolkit.java:1636) ~[?:1.8.0_242]
at java.awt.Toolkit$3.run(Toolkit.java:1634) ~[?:1.8.0_242]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_242]
at java.awt.Toolkit.loadLibraries(Toolkit.java:1633) ~[?:1.8.0_242]
at java.awt.Toolkit.<clinit>(Toolkit.java:1670) ~[?:1.8.0_242]
at org.lwjgl.MacOSXSysImplementation.<clinit>(MacOSXSysImplementation.java:51) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
at org.lwjgl.Sys.createImplementation(Sys.java:130) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
at org.lwjgl.Sys.<clinit>(Sys.java:111) ~[lwjgl-2.9.2-nightly-20140822.jar:?]
at net.minecraft.client.Minecraft.getSystemTime(Minecraft.java:3159) ~[Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:42) ~[Main.class:?]
... 12 more
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: java.lang.reflect.InvocationTargetException
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at java.lang.reflect.Method.invoke(Method.java:498)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at GradleStart.main(GradleStart.java:25)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: Caused by: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:49)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at java.lang.SecurityManager.checkExit(SecurityManager.java:761)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at java.lang.Runtime.exit(Runtime.java:108)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at java.lang.System.exit(System.java:973)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
[18:48:19] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: ... 6 more
我会解释为什么会发生,如何避免。
-
- なぜこのエラーが起きるのか
-
- どのように回避すればよいか (ForgeGradleが更新できる場合)
-
- どのように回避すればよいか (ForgeGradleをフォークする場合)
-
- どのように回避すればよいか
- TL;DR
なぜこのエラーが起きるのか
以下所示的GradleStart类内的代码是原因。
// some lines in hackNatives() in GradleStart
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
// some lines in hackNatives() in GradleStart
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
FG_1.2 GradleStart.java的第82到84行
ClassLoader.usr_pathのリセットのために、このコードはClassLoader.sys_pathsにnullを代入しています.
このコードの前にhackNativesでは”java.library.path” system propertyを再代入しています。.
しかし、ClassLoaderはライブラリのロードパスのキャッシュをJVM起動時の”java.library.path”を使用して作成します。
そのためそのキャッシュを破棄させる必要があります。
jdk8u242までは、ClassLoader.loadLibraryはClassLoader.sys_pathsがnullかどうかを確認して、
ClassLoader.sys_pathsとClassLoader.usr_pathを初期化していました。
GradleStart.hackNativesはこの動作をもとに書かれていました。
しかし、jdk8u242からClassLoader.loadLibraryがClassLoader.sys_pathsを確認しなくなり、
ClassLoader.sys_pathsとClassLoader.usr_pathをJVM起動時に初期化するようになりました。
そのためClassLoader.loadLibraryがClassLoader.sys_pathsがnullのときにヌルポを投げるようになりました。
これがOpenJDKの変更のdiffです。
如果可以更新ForgeGradle,该如何避免呢?如果你正在进行1.12.2版本的mod开发,建议使用MinecraftForge 1.12.2-14.23.5.2855的开发环境,这样可以避免出现问题,请使用这个版本。
如果要分支ForgeGradle,应该如何避免?我认为应该使用反射来执行类似于`usr_paths = initializePath(“java.library.path”)`的代码。在Minecraft Forge 1.15中,这个问题已经得到修复,所以我认为应该像这样编写代码。因此,我认为使用以下的代码来重置Forge的ClassLoader.usr_path是一个好的选择。
final Method initializePathMethod = ClassLoader.class.getDeclaredMethod("initializePath", String.class);
initializePathMethod.setAccessible(true);
final Object usrPathsValue = initializePathMethod.invoke(null, "java.library.path");
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
usrPathsField.set(null, usrPathsValue);
final Method initializePathMethod = ClassLoader.class.getDeclaredMethod("initializePath", String.class);
initializePathMethod.setAccessible(true);
final Object usrPathsValue = initializePathMethod.invoke(null, "java.library.path");
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
usrPathsField.set(null, usrPathsValue);
请选择以下一种中文表达方式:
MinecraftForge用户开发者测试代码LaunchTesting.java的126行至131行。
怎样才能避免呢?我为ForgeGradle创建了两个版本的分叉,即1.2版本(适用于Minecraft 1.7.x和1.8.x)。
如果你是为Minecraft 1.7.x和1.8.x开发的modder,你可以使用我的这个ForgeGradle分叉。
ForgeGradle 1.2(适用于Minecraft 1.7.x和1.8.x)的分叉版本在这里。
もし私のフォークが使いたくないか、他のバージョンのForgeGradleを使用する場合、自分自身でForgeGradleのフォークを作ってください。
2021/04/24編集
ForgeGradle 2.3のフォークは1.12.2開発に必要ではなくなったため、maintenanceを辞める予定しました。
そのためForgeGradle 2.3への本文内のリンクを削除しました。
1.12.2開発をする場合はどのように回避すればよいか (ForgeGradleが更新できる場合)に書かれているようにForgeGradle 4.1.xを使用してください
もともと合ったForgeGradle 2.3(minecraft 1.12.x)のフォークはこちらになります
太长,没读。
-
もし私の(anatawa12の)ForgeGradleのフォークを使用したくない場合、ForgeGradleのフォークを作成してください。
- もし私の(anatawa12の)ForgeGradleのフォークを使用したくない場合、ForgeGradleのフォークを作成してください。
-
- もしForgeGradle 1.2(minecraft 1.7.xと1.8.x)を使用している場合、私のForgeGradleのフォークを使用できます。
-
- もしForgeGradle 2.3(minecraft 1.12.x)を使用している場合、私のForgeGradleのフォークを使用できます。
- 他の場合。ForgeGradleのフォークを作成してください。