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)
有什么帮助吗?
在这种情况下,问题实际上出在 MinecraftForge 上,不一定是由于错误,而是由于 Forge 实施的保护。
Forge 可以完全控制加载 mod 的类,并且它会根据一组受限的包路径专门检查其加载的每个类的包信息,以防止其自己的依赖项因加载类似依赖项的不同版本而意外被覆盖。在这种情况下,Forge 使用了一些 Apache 库,因此它阻止从包命名空间加载类org.apache。
因此,当加载 mod 的类时,Forge 会注意到这些类的来源org.apache并选择专门不加载它们。这意味着当Unirest尝试JDA使用它所依赖的 Apache 依赖项时,它们不存在,并且您会遇到NoClassDefFoundError.
处理这个问题的最佳方法是正确遮蔽您的依赖项。考虑到您使用的是 Forge,您很可能使用 Gradle。MinecraftForge实际上有一个关于如何正确遮蔽依赖项的指南。
| 归档时间: |
|
| 查看次数: |
3081 次 |
| 最近记录: |