我是Java的初学者,当我运行.jar时遇到了一些麻烦。 我在netty类上得到了一个ClassNotFoundException。 似乎逻辑上我的.jar找不到netty类。
这是我的追踪:
Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup
at src.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: io.netty.channel.EventLoopGroup
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more

使用gradle编译工作正常。 我的main 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,由main 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

我不明白为什么当我编译所有内容时,当我运行它时,它并没有找到netty类。
你能帮帮我吗? 谢谢!答案 0 :(得分:1)
从命令行运行时,不会将jar添加到编译时类路径中存在的运行时类路径中。
在Gradle中创建跑步者任务可能最简单,如下所示:
task runMyApp(type: JavaExec) {
dependsOn 'classes'
main = 'src.Main'
classpath = sourceSets.main.runtimeClasspath
}
我建议你使用application plugin将你编译的jar捆绑到zip(或tar)文件和依赖jar之外,它还会为windows和unix创建一个启动脚本。它还添加了installDist
任务,该任务将应用程序部署为从命令行本地运行。
另外,引用本地jar是个坏主意。如果可能,您应该从存储库获取依赖项。即以下是不好的
compile files("./lib/netty-all-4.1.16.Final.jar")
答案 1 :(得分: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
这是我的build.gradle文件中添加的清单:
jar {
manifest {
attributes("Implementation-Title": "Server",
"Implementation-Version": "1.0",
"Class-Path": "../lib/netty-all-4.1.16.Final.jar")
}
}
我认为我所做的是一种不好的做法。还有更好的方法吗?