2017-10-19 143 views
0

我是初學Java,當我運行我的.jar時遇到一些麻煩。 我得到了一個N​​etty類的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 build',並執行我的.jar我使用java -jar myjar.jar – Fake

+0

您可以看看這個答案:https://stackoverflow.com/a/18413058/327680 –

回答

1

從命令行運行時,不會將jar添加到編譯時類路徑中存在的運行時類路徑中。

這也可能是最簡單的搖籃,以創造一個亞軍任務如下:

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

我建議你使用application plugin將捆綁你的編譯罐子成zip(或焦油)文件旁邊的依賴罐子,它也會爲windows和unix創建一個啓動腳本。它還增加了一個installDist任務,該任務將應用程序部署爲從命令行本地運行。

此外,引用本地罐子是一個壞主意。如果可能的話,你應該從存儲庫中獲得你的依賴關係。即,以下是壞

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

謝謝爲了您的幫助,我刪除了這條線,沒有它,它運行良好 – Fake

0

好吧,我有一個清單到我的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 }

我認爲我所做的是一種不好的做法。有沒有更好的辦法 ?

相關問題