即使依赖库存在,Java Jar ClassNotFoundException

Nic*_*ris 1 java minecraft-forge

我正在创建一个使用(非官方)Discord API、JDA 的(Minecraft)Forge mod。我在 Eclipse IDE 中执行此操作。

在 IDE 中,我可以很好地添加带有依赖项的 JDA,并且代码中不会出现任何错误。然后,使用 gradlew 并编译它,当我尝试运行它(在 Minecraft 中)时出现错误。

我让几个人检查我的 build.gradle 以确保它是正确的,而且确实如此。我现在假设这是一个一般的 Java 错误。

无论如何,错误:

    java.lang.NoClassDefFoundError: org/apache/http/nio/reactor/IOReactorException
    at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:151)
    at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
    at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:56)
    at net.dv8tion.jda.requests.Requester.toObject(Requester.java:100)
    at net.dv8tion.jda.requests.Requester.post(Requester.java:55)
    at net.dv8tion.jda.entities.impl.JDAImpl.login(JDAImpl.java:152)
    at net.dv8tion.jda.JDABuilder.buildAsync(JDABuilder.java:272)
    at net.dv8tion.jda.JDABuilder.buildBlocking(JDABuilder.java:307)
    at com.scarabcoder.ereijan.gui.GuiLogin.connect(GuiLogin.java:168)
    at com.scarabcoder.ereijan.gui.GuiLogin.func_146284_a(GuiLogin.java:143)
    at net.minecraft.client.gui.GuiScreen.func_73864_a(GuiScreen.java:466)
    at com.scarabcoder.ereijan.gui.GuiLogin.func_73864_a(GuiLogin.java:128)
    at net.minecraft.client.gui.GuiScreen.func_146274_d(GuiScreen.java:554)
    at net.minecraft.client.gui.GuiScreen.func_146269_k(GuiScreen.java:523)
    at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1674)
    at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1024)
    at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:349)
    at net.minecraft.client.main.Main.main(SourceFile:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:310)
    at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:395)
    at org.multimc.EntryPoint.listen(EntryPoint.java:170)
    at org.multimc.EntryPoint.main(EntryPoint.java:54)
Caused by: java.lang.ClassNotFoundException: org.apache.http.nio.reactor.IOReactorException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:106)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 32 more
Run Code Online (Sandbox Code Playgroud)

在 jar 文件内: “缺失”类的路径(它存在)

有什么帮助吗?

DV8*_*rld 5

在这种情况下,问题实际上出在 MinecraftForge 上,不一定是由于错误,而是由于 Forge 实施的保护。

Forge 可以完全控制加载 mod 的类,并且它会根据一组受限的包路径专门检查其加载的每个类的包信息,以防止其自己的依赖项因加载类似依赖项的不同版本而意外被覆盖。在这种情况下,Forge 使用了一些 Apache 库,因此它阻止从包命名空间加载类org.apache

因此,当加载 mod 的类时,Forge 会注意到这些类的来源org.apache并选择专门不加载它们。这意味着当Unirest尝试JDA使用它所依赖的 Apache 依赖项时,它们不存在,并且您会遇到NoClassDefFoundError.

处理这个问题的最佳方法是正确遮蔽您的依赖项。考虑到您使用的是 Forge,您很可能使用 Gradle。MinecraftForge实际上有一个关于如何正确遮蔽依赖项的指南。