Java Jar ClassNotFoundException,即使存在依赖库

时间:2016-04-16 04:03:52

标签: java forge

我正在创建一个(Minecraft)Forge mod,它使用(非官方)Discord API,JDA。我在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

在jar文件中: The path to the "missing" class (it exists)

任何帮助??

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

NoClassDefFoundError - 由于您的代码所依赖的类文件在编译时存在但在运行时未找到。检查构建和运行时类路径。

答案 2 :(得分:0)

将Discord API的依赖项添加到项目中可以解决问题。为API使用阴影Jar也可以。