我正在尝试制作一个Minecraft Forge 1.16.5 mod,它使用一个名为JDA(Java Discord API)的库。所以我已经制作了mod,并将所有依赖项放入jar文件中,包括JDA及其依赖项。但是当我运行服务器时,它说找不到JDA使用的库的类。这是我得到的错误:
[14okt2023 23:58:10.203] [Server thread/ERROR] [net.minecraft.server.MinecraftServer/]: Encountered an unexpected exception
java.lang.NoClassDefFoundError: gnu/trove/map/TLongObjectMap
at net.dv8tion.jda.internal.utils.Checks.notBlank(Checks.java:98) ~[discord_statusbot:13.0]
at net.dv8tion.jda.api.entities.Activity.playing(Activity.java:128) ~[discord_statusbot:13.0]
at mopsy.productions.discord.statusbot.BotManger.regBot(BotManger.java:24) ~[discord_statusbot:13.0]
at mopsy.productions.discord.statusbot.StatusbotMain.start(StatusbotMain.java:45) ~[discord_statusbot:13.0]
at net.minecraftforge.eventbus.ASMEventHandler_0_StatusbotMain_start_FMLServerStartedEvent.invoke(.dynamic) ~[?:?]
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-4.0.0.jar:?]
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?]
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?]
at net.minecraftforge.fml.server.ServerLifecycleHooks.handleServerStarted(ServerLifecycleHooks.java:106) ~[forge:?]
at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:622) ~[?:?]
at net.minecraft.server.MinecraftServer.func_240783_a_(MinecraftServer.java:232) ~[?:?]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_311]
Caused by: java.lang.ClassNotFoundException: gnu.trove.map.TLongObjectMap
at java.lang.ClassLoader.findClass(Unknown Source) ~[?:1.8.0_311]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_311]
at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:94) ~[modlauncher-8.1.3.jar:?]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_311]
... 12 more
字符串
但这很奇怪,因为JDA和JDA库都存在于jar文件中(我已经使用反编译器进行了检查)
我能找到的唯一一件事是,在服务器中有一个名为libraries的文件夹,其中包含旧版本的库。我能想到的唯一一件事是,Forge首先加载他们的库,然后无法加载新版本的库。我不确定如何解决这个问题,有人有想法吗?(我正在使用Gradle构建我的mod)
起初我尝试使用ForgeGradle的一个名为Jar-in-jar的功能。但当我尝试时,它甚至找不到JDA。我读到了一些关于使用另一个类加载器的东西,但我不确定这将如何/是否有效。
值得注意的是,当我在IntelliJ中运行mod时,它不会抛出错误。
1条答案
按热度按时间yvfmudvl1#
我使用shadow plugin解决了这个问题。在将shadow插件添加到我的项目后,我将以下代码添加到我的build.gradle文件中。
字符串
第一部分确保冲突库被放入另一个包。然后在依赖项部分,我将所有库jar包含到最终jar中。最后,生成的jar文件需要重新混淆,因为否则它将无法使用Minecraft服务器/客户端的Map。
最终,重新混淆的jar将生成为projectdir/build/reobfShadowjar/output.jar