gradle构建“ ClassNotFoundException”

时间:2019-07-07 05:15:16

标签: java gradle jetty embedded-jetty

我正在尝试构建和运行Jetty嵌入式“ hello world”应用程序。

构建成功,没有错误,但是当我尝试运行它时,出现错误。我认为这是因为运行我的码头罐子没有添加到类路径中。但是我没有在我的gradle版本中找到纠正此问题的正确方法。

我的build.gradle如下......

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.eclipse.jetty:jetty-servlet:+'
    implementation 'org.eclipse.jetty:jetty-client:+'
    // implementation 'org.eclipse.jetty:jetty-webapp:+'
    // implementation 'org.eclipse.jetty:jetty-jsp:+'
    // implementation 'org.eclipse.jetty:jetty-annotations:+'
}

我的应用程序有两个主要的可执行类。 ChessServer和ChessClient。

我用来运行ChessServer的命令如下...

java -ea -cp build/classes/java/main/ ChessServer

还有我在运行时遇到的特定错误...

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Server
    at ChessServer.main(ChessServer.java:6)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.Server
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

1 个答案:

答案 0 :(得分:1)

由于您是使用gradle构建的,因此最好也使用gradle运行,而不是通过命令行中的“ java”手动运行。

如果要运行您的类,则需要指定整个类路径(包括依赖项jar)。您只告诉Java您的类在哪里。

我建议在Gradle中使用JavaExec任务。

例如:

task run(type: JavaExec) {
   classpath = sourceSets.main.runtimeClasspath 
   main = 'ChessServer'
} 

然后从命令行

gradle run

还有application plugin,它可以将您的类和依赖项打包为zip。