当前位置: 首页 > 知识库问答 >
问题:

Java Jar ClassNotFoundException即使依赖库存在

杜俊风
2023-03-14

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

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

我让几个人检查了我的身材。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

有什么帮助吗??

共有3个答案

施博文
2023-03-14

将DiscordAPI的依赖项添加到您的项目中应该可以解决这个问题。为您的API使用着色的Jar也可以工作。

荣曾笑
2023-03-14

NoClassDefFoundError——是因为代码所依赖的类文件在编译时存在,但在运行时找不到。检查构建和运行时类路径。

岳研
2023-03-14

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

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

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

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

 类似资料:
  • 问题内容: 我正在通过JNI运行一个库(我没有写过),并且在内部它调用了另一个DLL。除非我将另一个DLL的路径放在系统PATH变量上(我在Windows XP上),否则我会收到一条错误消息:“找不到依赖的库”。我希望能够在Java命令行上处理此问题,并且我已经尝试将其添加到- Djava.library.path和classpath中,但都没有起作用(我希望- Djava.library.pat

  • 添加Lib库依赖关系有两种方式: 非管理依赖方式,是通过将依赖的Jar包放到项目的lib目录 管理依赖方式,是在工程构建配置中配置依赖关系,sbt会自动从托管代码库中下载依赖库 非管理依赖方式 很多人用管理依赖的方式替代非管理方式,其实非管理方式用起来非常方便。非管理依赖方式的工作原理就是将jar包放到lib目录下,sbt会自动的将其添加到classpath中。也可以将一些测试依赖放到lib目录下

  • 问题内容: 问题: 即使我从Maven存储库中复制了依赖项,也不会下载。 当我将鼠标悬停在Eclipse中的依赖项上时,它会发出警告:“ ”。 当我尝试或警告时:“ ”。 尝试过: 将jar下载到文件夹中,然后在编辑器中刷新。 当我或它似乎忽略它。 运行中。 与或相同。 深入: 该依赖关系 存在 于Maven存储库中(版本也是正确的)。 使用Eclipse EE Neon 4.6.3,Apache

  • 如上所述,我对maven有一个问题。在我当前的eclipse项目中,我使用maven进行依赖性管理,直到现在,它仍然运行良好。 该项目不再有效,并声明: 如果我检查文件夹,就会发现一些文件与jar同名,但以jar结尾。最后更新。 我尝试了maven clean和maven update,但没有成功。我的pom中的线条。xml标记为红色,表示: 这是我的pom的内容。xml: 这一块是一个有标记的块

  • 我正在尝试将即时应用程序实现到使用Firebase数据库的项目中。我的目标是SDK版本27,因此支持库在版本27.0.2上。 Firebase数据库版本为11.8.0,gms版本为3.1.0。当我尝试同步时,会出现以下错误: 通过在即时应用之前明确添加以下依赖项,我能够绕过这个问题 但是对于即时应用程序,即使我在功能模块(app-base)中拥有它们,当我尝试构建实际应用程序(com.androi

  • 我想将审核更改持久化到oracle db。micro服务是一个带有hibernate的Spring Boot应用程序。我在javers的mvn存储库链接中发现了许多依赖项 我应该为oracle db使用哪个依赖项?