【问题标题】:Java : ClassNotFoundException when running program with netty [Gradle]Java:使用netty [Gradle]运行程序时出现ClassNotFoundException
【发布时间】:2018-03-31 12:08:27
【问题描述】:

我是 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 编译可以正常工作。 我的主要 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

我不明白为什么当我编译一切正常时,当我运行它时却找不到 netty 类。

你能帮帮我吗? 谢谢!

【问题讨论】:

  • 你是如何运行你的应用程序的?您是使用 Gradle 还是直接调用它?异常表明 Netty 类不在您的运行时类路径中。
  • 嗨 Oz,编译我使用“gradle build”,执行我的 .jar 我使用 java -jar myjar.jar
  • 你可以看看这个答案:stackoverflow.com/a/18413058/327680

标签: java class gradle runtime netty


【解决方案1】:

当您从命令行运行时,您不会将 jars 添加到编译时类路径中存在的运行时类路径中。

在 Gradle 中创建运行器任务可能最简单,如下所示:

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

我建议您使用application plugin,它将您编译的 jar 捆绑到一个 zip(或 tar)文件以及依赖 jar 中,它还将为 windows 和 unix 创建一个启动脚本。它还添加了一个installDist 任务,该任务将应用程序部署为从命令行本地运行。

此外,引用本地 jars 是一个坏主意。如果可能,您应该从存储库中获取依赖项。即以下是不好的

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

【讨论】:

  • 感谢您的帮助,我删除了这一行,没有它也可以正常工作
【解决方案2】:

好的,我的 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")
		}
	}

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

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2021-12-12
    相关资源
    最近更新 更多