Java Jar ClassNotFoundException,即使存在依赖库

Java Jar ClassNotFoundException,即使存在依赖库,java,forge,Java,Forge,我正在创建一个(Minecraft)Forge mod,它使用(非官方的)discordapi,JDA。我是在EclipseIDE中这样做的 在IDE中,我可以添加带有依赖项的JDA,并且代码中没有错误。然后,使用gradlew并编译它,当我尝试运行它时(在Minecraft中)会出现一个错误 我让几个人检查了我的build.gradle,以确保它是正确的,而且是正确的。在这一点上,我假设这是一个一般的Java错误 无论如何,错误是: java.lang.NoClassDefFoundE

我正在创建一个(Minecraft)Forge mod,它使用(非官方的)discordapi,JDA。我是在EclipseIDE中这样做的

在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文件中:


任何帮助???

NoClassDefFoundError-都是由于代码所依赖的类文件在编译时存在,但在运行时找不到。检查生成和运行时类路径。

NoClassDefFoundError-是由于代码所依赖的类文件在编译时存在,但在运行时找不到。检查生成和运行时类路径。

将Discord API的依赖项添加到项目中应该可以解决此问题。将shaided Jar用于您的API也可能有效。

将Discord API的依赖项添加到您的项目中应该可以解决这个问题。在API中使用shaided Jar也可能会起作用。

在这种情况下,问题实际上在于MinecraftForge,不一定是因为bug,而是因为Forge实现了保护

Forge可以完全控制加载mod的类,它会根据一组受限的包路径专门检查所加载的每个类的包信息,以保护自己的依赖项不被加载不同版本的类似依赖项意外覆盖。在本例中,Forge使用了一些ApacheLIB,因此它可以防止从
org.Apache
包名称空间加载类

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


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

在这种情况下,问题实际上在于MinecraftForge,不一定是因为bug,而是因为Forge实施了保护

Forge可以完全控制加载mod的类,它会根据一组受限的包路径专门检查所加载的每个类的包信息,以保护自己的依赖项不被加载不同版本的类似依赖项意外覆盖。在本例中,Forge使用了一些ApacheLIB,因此它可以防止从
org.Apache
包名称空间加载类

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


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

共享清单文件可能有助于识别根本原因共享清单文件可能有助于识别根本原因K已失效,此处存档和相关锻造讨论链接已失效,此处存档和相关锻造讨论已失效