gradle 有没有办法在同一个JVM中使用两个版本的库?

ctehm74n  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在尝试制作一个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时,它不会抛出错误。

yvfmudvl

yvfmudvl1#

我使用shadow plugin解决了这个问题。在将shadow插件添加到我的项目后,我将以下代码添加到我的build.gradle文件中。

shadowJar {
    relocate('gnu.trove', 'newpath.gnu.trove')
    //some more relocation of libraries conflicting with Forge.
    dependencies {
        include(dependency("com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.3"))
        include(dependency("net.dv8tion:JDA:5.0.0-beta.13"))
        include(dependency("net.sf.trove4j:trove4j:3.0.3"))
        //Some more libraries that needed to be included.
    }
    classifier ''
}
shadowJar.finalizedBy('reobfShadowJar')
reobf {
    shadowJar{}
}

字符串
第一部分确保冲突库被放入另一个包。然后在依赖项部分,我将所有库jar包含到最终jar中。最后,生成的jar文件需要重新混淆,因为否则它将无法使用Minecraft服务器/客户端的Map。
最终,重新混淆的jar将生成为projectdir/build/reobfShadowjar/output.jar

相关问题