2017-10-19 167 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 }

我认为我所做的是一种不好的做法。有没有更好的办法 ?

相关问题