You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

问题原因

  1. 静态初始化时机过早:模组类的静态字段在Forge完成加载流程前就被初始化,此时JNA的本地库还未准备好,导致链接错误。
  2. 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.ktsnamed<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

火山引擎 最新活动