Minecraft Forge 1.8.9模组开发环境正常,导出后游戏启动崩溃
解决Minecraft Forge 1.8.9模组导出后启动崩溃问题
问题现象
开发环境(IntelliJ IDEA)中模组可正常启动,但导出为Jar包后,游戏启动阶段直接崩溃,报错如下:
Description: There was a severe problem during mod loading that has caused the game to fail Caused by: java.lang.UnsatisfiedLinkError: org.polyfrost.shade.jna.Native.getNativeVersion()Ljava/lang/String; at org.polyfrost.shade.jna.Native.getNativeVersion(Native Method) at org.polyfrost.shade.jna.Native.<clinit>(Native.java:223) at org.polyfrost.shade.jna.Structure.setAlignType(Structure.java:298) at org.polyfrost.shade.jna.Structure.<init>(Structure.java:215) at org.polyfrost.shade.jna.Structure.<init>(Structure.java:211) at org.polyfrost.shade.jna.Structure.<init>(Structure.java:198) at org.polyfrost.shade.jna.Structure.<init>(Structure.java:190) at org.polyfrost.shade.jna.platform.win32.WinNT$OSVERSIONINFOEX.<init>(WinNT.java:1980) at org.polyfrost.shade.jna.platform.win32.VersionHelpers.IsWindowsVersionOrGreater(VersionHelpers.java:59) at org.polyfrost.shade.jna.platform.win32.VersionHelpers.IsWindows10OrGreater(VersionHelpers.java:194) at org.polyfrost.shade.oshi.hardware.platform.windows.WindowsGlobalMemory.<clinit>(WindowsGlobalMemory.java:41) at org.polyfrost.shade.oshi.hardware.platform.windows.WindowsHardwareAbstractionLayer.createMemory(WindowsHardwareAbstractionLayer.java:37) at org.polyfrost.shade.oshi.util.Memoizer$1.get(Memoizer.java:65) at org.polyfrost.shade.oshi.hardware.common.AbstractHardwareAbstractionLayer.getMemory(AbstractHardwareAbstractionLayer.java:60) at org.polyfrost.example.ExampleMod.<clinit>(ExampleMod.java:18)
崩溃触发点为代码第18行:public static final GlobalMemory memory = HARDWARE.getMemory();
问题原因
- 静态初始化时机过早:模组类的静态字段在Forge完成加载流程前就被初始化,此时JNA的本地库还未准备好,导致链接错误。
- ShadowJar未正确打包JNA本地库:JNA依赖平台相关的本地库文件(如
.dll/.so/.dylib),默认ShadowJar配置不会自动打包这些文件,运行时无法找到本地库。
解决方案
1. 调整代码,延迟初始化逻辑
将硬件信息的初始化移至Forge的初始化事件中,避免过早触发JNA本地库加载:
package org.polyfrost.example; import cc.polyfrost.oneconfig.events.EventManager; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import oshi.SystemInfo; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; @Mod(modid = ExampleMod.MODID, name = ExampleMod.NAME, version = ExampleMod.VERSION) public class ExampleMod { public static final String MODID = "@ID@"; public static final String NAME = "@NAME@"; public static final String VERSION = "@VER@"; public static SystemInfo SYSTEM_INFO; public static HardwareAbstractionLayer HARDWARE; public static GlobalMemory memory; // 改为非final,延迟初始化 @Mod.EventHandler public void init(FMLInitializationEvent event){ EventManager.INSTANCE.register(this); // 在Forge初始化流程中完成硬件信息初始化 SYSTEM_INFO = new SystemInfo(); HARDWARE = SYSTEM_INFO.getHardware(); memory = HARDWARE.getMemory(); } }
2. 修改ShadowJar配置,打包JNA本地库
在build.gradle.kts的named<ShadowJar>块中添加配置,确保JNA本地库被正确打包并可被加载:
named<ShadowJar>("shadowJar") { relocate("oshi", "org.polyfrost.shade.oshi") relocate("com.sun.jna", "org.polyfrost.shade.jna") relocate("org.slf4j", "org.polyfrost.shade.slf4j") // 打包JNA平台相关本地库 from(configurations.runtimeClasspath.get().filter { it.name.endsWith(".dll") || it.name.endsWith(".so") || it.name.endsWith(".dylib") }) { into("org/polyfrost/shade/jna/native") } // 配置JNA本地库加载路径 manifest { attributes(mapOf( "jna.natives.path" to "org/polyfrost/shade/jna/native" )) } }
3. 优化依赖配置
合并重复的依赖声明,简化配置:
dependencies { shade("com.github.oshi:oshi-core:6.8.2") shade("net.java.dev.jna:jna:5.17.0") shade("net.java.dev.jna:jna-platform:5.17.0") }
验证方法
重新构建ShadowJar包,放入游戏mods文件夹,启动游戏即可正常加载模组。
内容的提问来源于stack exchange,提问作者Zacgamingpro1234




