若要在面向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);

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);

请选择以下一种中文表达方式:

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のフォークを作成してください。

 

    • もしForgeGradle 1.2(minecraft 1.7.xと1.8.x)を使用している場合、私のForgeGradleのフォークを使用できます。

 

    • もしForgeGradle 2.3(minecraft 1.12.x)を使用している場合、私のForgeGradleのフォークを使用できます。

 

    他の場合。ForgeGradleのフォークを作成してください。

bannerAds