4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

マインクラフト1.12以前向けのForgeGradleでrunClientをjdk8最新版で実行するには

Last updated at Posted at 2020-04-27

go to 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

なぜ起きるか、どのようにして回避すれば良いかを示します。

なぜこのエラーが起きるのか

以下に示す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#L82-L84

ClassLoader.usr_pathのリセットのために、このコードはClassLoader.sys_pathsnullを代入しています.
このコードの前にhackNativesでは"java.library.path" system propertyを再代入しています。.
しかし、ClassLoaderはライブラリのロードパスのキャッシュをJVM起動時の"java.library.path"を使用して作成します。
そのためそのキャッシュを破棄させる必要があります。

jdk8u242までは、ClassLoader.loadLibraryClassLoader.sys_pathsnullかどうかを確認して、
ClassLoader.sys_pathsClassLoader.usr_pathを初期化していました。
GradleStart.hackNativesはこの動作をもとに書かれていました。

しかし、jdk8u242からClassLoader.loadLibraryClassLoader.sys_pathsを確認しなくなり、
ClassLoader.sys_pathsClassLoader.usr_pathをJVM起動時に初期化するようになりました。
そのためClassLoader.loadLibraryClassLoader.sys_pathsnullのときにヌルポを投げるようになりました。
これがOpenJDKの変更のdiffです。

どのように回避すればよいか (ForgeGradleが更新できる場合)

もし1.12.2のmoddingをしている場合、MinecraftForge 1.12.2-14.23.5.2855の開発環境を使用すると問題が発生しなくなるので、そちらを使用してください。

どのように回避すればよいか (ForgeGradleをフォークする場合)

usr_paths = initializePath("java.library.path")のようなコードをリフレクションを使用して実行する必要があります。
minecraft 1.15向けのMinecraft Forgeではこの問題が修正されているので、コレと同じように書くべきだと私は考えます。
なので以下の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 userdev LaunchTesting.java#L126-L131

どのように回避すればよいか

ForgeGradleのフォークを1.2(minecraft 1.7.xと1.8.x向けのForgeGradle)の2つのバージョン向けに作りました。
もしマインクラフト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)のフォークはこちらになります

TL;DR

  • もし私の(anatawa12の)ForgeGradleのフォークを使用したくない場合、ForgeGradleのフォークを作成してください。
  • もしForgeGradle 1.2(minecraft 1.7.xと1.8.x)を使用している場合、私のForgeGradleのフォークを使用できます。
  • もしForgeGradle 2.3(minecraft 1.12.x)を使用している場合、私のForgeGradleのフォークを使用できます。
  • 他の場合。ForgeGradleのフォークを作成してください。
4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?