Java:使用netty运行程序时的ClassNotFoundException [Gradle]

时间:2017-10-19 12:41:25

标签: java class gradle runtime netty

我是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类。

你能帮帮我吗? 谢谢!

2 个答案:

答案 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")
		}
	}

我认为我所做的是一种不好的做法。还有更好的方法吗?