2016-04-16 40 views
0

(非公式の)Discord API、JDAを使用する(Minecraft)Forge modを作成しています。私はEclipse IDEでこれをやっています。Java Jar ClassNotFoundException依存ライブラリが存在する場合でも

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)

任意のヘルプ?

+0

マニフェストファイルを共有すると、原因を特定するのに役立ちます – Waqas

答えて

2

この場合、問題は実際にはMinecraftForgeにあります。必ずしもバグではありませんが、実際にはForgeが実装しているためです。

Forgeはmodのクラスのロードを完全に制御し、ロードするすべてのクラスのパッケージ情報を制限されたパッケージパスのセットに対してチェックして、独自の依存関係を誤って上書きしないようにします。同様の依存関係。この場合、ForgeはいくつかのApacheライブラリを使用するため、org.apacheパッケージの名前空間からクラスを読み込むことはできません。

このように、Modのクラスをロードするとき、Forgeはこれらのクラスがorg.apacheから来ていることに気付き、特にそれらをロードしないことを選択します。これは、JDAによって使用されるUnirestの依存関係が依存しているApache依存関係を使用しようとすると、存在しないため、NoClassDefFoundErrorに遭遇することを意味します。

これに対処する最も良い方法は、依存関係を適切にシェードすることです。あなたがForgeを使用していると考えると、あなたはGradleを使用している可能性が最も高いです。 MinecraftForgeは実際にあなたの依存関係を適切に陰影付けする方法についてのガイドを持っていますhere

0

NoClassDefFoundError - コードが依存するクラスファイルによるものですが、コンパイル時には存在しますが、実行時には見つかりません。ビルドクラスとランタイムクラスパスを確認してください。

0

問題を解決するには、Discord APIの依存関係をプロジェクトに追加する必要があります。あなたのAPIにshaided Jarを使用することもできます。

関連する問題