2017-10-19 55 views
0

私はJavaで初心者ですが、私の.jarを実行するといくつか問題があります。 NettyクラスでClassNotFoundExceptionが発生しました。 私の.jarがnettyクラスを見つけられないというのは論理的です。Java:nettyでプログラムを実行しているときにClassNotFoundExceptionが発生しました[Gradle]

Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup 
 
\t at src.Main.main(Main.java:14) 
 
Caused by: java.lang.ClassNotFoundException: io.netty.channel.EventLoopGroup 
 
\t at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) 
 
\t at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) 
 
\t at java.base/java.lang.ClassLoader.loadClass(Unknown Source) 
 
\t ... 1 more

コンパイルはGradleので正常に動作します:

は、ここに私のトレースです。 メインのbuild.gradleは、プログラムをコンパイルする異なるフォルダに2つのbuild.gradleを呼び出します。 ここに私のメインのbuild.gradleです:

subprojects { 
 
     apply plugin: 'java' 
 

 
     repositories { 
 
       mavenCentral() 
 
     } 
 

 
     dependencies { 
 
       compile 'io.netty:netty-all:4.1.16.Final' 
 
       compile files("./lib/netty-all-4.1.16.Final.jar") 
 
       testCompile 'junit:junit:4.12' 
 
     } 
 
}

そして、ここでの主なbuild.gradleによって呼び出されるbuild.gradleあり、それは私のsources.javaをコンパイル

apply plugin: "java" 
 

 
sourceSets { 
 
     main.java.srcDir "./src/" 
 
} 
 

 
jar { 
 
     manifest.attributes "Main-Class": "src.Main" 
 
     destinationDir project.file('../Jar/') 
 
     baseName 'Server' 
 
}

マイファイルツリーは次のようになります。

MyProject 
 
--> build.gradle 
 
--> settings.gradle 
 
--> lib [DIR] 
 
    --> netty-all-4.1.16.Final.jar 
 
--> server [DIR] 
 
    --> build.gradle 
 
    --> src [DIR] 
 
     --> Main.java

私はすべての作品をコンパイルしたとき、私は理由を理解していない、と私はそれがネッティークラスを見つけることができません実行したとき。

私を助けてもらえますか? ありがとうございました!

+0

どのようにアプリケーションを実行していますか?あなたはGradleを使用していますか、それとも直接呼び出していますか?例外は、Nettyクラスが実行時クラスパスにないことを示します。 –

+0

こんにちはオズ、私は 'gradleビルド'を使用してコンパイルし、私の.jarを実行するjava -jar myjar.jarを使用 – Fake

+0

あなたはこの答えを見るかもしれません:https://stackoverflow.com/a/18413058/327680 –

答えて

1

コマンドラインから実行しているときは、コンパイル時クラスパス上に存在するランタイムクラスパスにjarを追加していません。

それは次のようにGradleのでランナータスクを作成するには、おそらく最も簡単です:

task runMyApp(type: JavaExec) { 
    dependsOn 'classes' 
    main = 'src.Main' 
    classpath = sourceSets.main.runtimeClasspath 
} 

私はあなたがジッパーにコンパイル済みのjarファイルをバンドルしますapplication plugin(またはタール)は、依存関係のjarファイルと一緒にファイルを使用することを示唆しています、 WindowsとUnix用の起動スクリプトも作成します。また、コマンドラインからローカルに実行するようにアプリケーションをデプロイするinstallDistタスクも追加されています。

また、ローカルジャーを参照することは悪い考えです。可能であれば、依存関係をリポジトリから取得する必要があります。以下は、

compile files("./lib/netty-all-4.1.16.Final.jar") 
+0

ありがとうあなたの助けのために、私はこの行を削除し、それなしでうまくいく – Fake

0

[OK]を悪いですつまり、私は私のbuild.gradleにマニフェストを持っていたし、今では動作しますが、私は、実行時に警告を取得しています:ここで

WARNING: An illegal reflective access operation has occurred 
 
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/Users/AK1/Java/Java_jcoinche_2017/lib/netty-all-4.1.16.Final.jar) to constructor java.nio.DirectByteBuffer(long,int) 
 
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil 
 
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations 
 
WARNING: All illegal access operations will be denied in a future release

私のマニフェストは私のビルドに追加されています。Gradleのファイル:

jar { 
 
\t \t manifest { 
 
\t \t \t attributes("Implementation-Title": "Server", 
 
       \t "Implementation-Version": "1.0", 
 
\t \t \t "Class-Path": "../lib/netty-all-4.1.16.Final.jar") 
 
\t \t } 
 
\t }

私は私がやったことは悪い習慣だと思います。より良い方法がありますか?

関連する問題