2016-04-16 4 views
0

Ich erstelle einen (Minecraft) Forge Mod, der die (inoffizielle) Discord API, JDA, verwendet. Ich mache das in der Eclipse IDE.Java Jar ClassNotFoundException obwohl abhängige Bibliothek existiert

In der IDE kann ich die JDA mit Abhängigkeiten gut hinzufügen und bekomme keine Fehler in meinem Code. Dann, mit Gradlew und kompilieren, bekomme ich einen Fehler, wenn ich es versuche (in Minecraft).

Ich hatte ein paar Leute überprüfen meine Build.gradle, um sicherzustellen, dass es korrekt war, und es ist. Ich nehme an dieser Stelle an, dass es sich um einen allgemeinen Java-Fehler handelt.

Anyways, der Fehler:

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 

Und in der JAR-Datei: The path to the "missing" class (it exists)

Jede Hilfe ??

+0

Das Freigeben der Manifestdatei kann dabei helfen, die Ursache zu ermitteln – Waqas

Antwort

2

In diesem Fall liegt das Problem tatsächlich bei MinecraftForge, nicht unbedingt aufgrund eines Fehlers, sondern aufgrund eines von Forge implementierten Schutzes.

Forge hat die volle Kontrolle über das Laden der Klassen eines Mods und prüft speziell die Paketinformationen jeder geladenen Klasse gegen eine Menge von eingeschränkten Paketpfaden, um seine eigenen Abhängigkeiten vor dem versehentlichen Überschreiben durch Laden einer anderen Version zu schützen ähnliche Abhängigkeit. In diesem Fall verwendet Forge einige Apache-Bibliotheken, sodass das Laden von Klassen aus dem Paketnamen org.apache verhindert wird.

Wenn Forge die Klassen Ihres Mods lädt, bemerkt Forge, dass diese Klassen von org.apache stammen und wählt, sie speziell nicht zu laden. Das bedeutet, dass, wenn die Unirest-Abhängigkeit, die von JDA verwendet wird, versucht, die Apache-Abhängigkeiten zu verwenden, auf denen sie beruht, sie nicht vorhanden sind und Sie auf NoClassDefFoundError stoßen.

Der beste Weg, damit umzugehen, ist, Ihre Abhängigkeiten richtig abzuschirmen. Wenn Sie Forge verwenden, verwenden Sie höchstwahrscheinlich Gradle. MinecraftForge hat tatsächlich eine Anleitung, wie Sie Ihre Abhängigkeiten richtig schattieren here.

0

NoClassDefFoundError - liegt an der Klassendatei, von der Ihr Code abhängt, ist zur Kompilierzeit vorhanden, wird aber zur Laufzeit nicht gefunden. Überprüfen Sie Ihre Build- und Runtime-Klassenpfade.

0

Die Abhängigkeiten Ihrer Discord-API zu Ihrem Projekt sollten das Problem beheben. Die Verwendung des Shaided Jar für Ihre API funktioniert möglicherweise ebenfalls.

Verwandte Themen