Java Gradle构建:NoClassDefFoundError

3

我的build.gradle文件如下:

apply plugin: 'java' sourceCompatibility = 1.8

repositories {
    mavenCentral() }


dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'io.javalin:javalin:1.3.0'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
    compile 'org.slf4j:slf4j-simple:1.7.25' }

jar {
    manifest {
        attributes(
                'Class-Path': configurations.runtime.files.collect {"$it.name"}.join(' '),
                'Main-Class': 'products.ProductAPI'
        )
    } }

task stage {
    dependsOn 'build'
    dependsOn 'clean'
    build.mustRunAfter clean }

尝试使用gradle构建Java应用程序并将其部署到Heroku服务器。我在java -jar build/libs/MyApp-0.0.1.jar上遇到了一些问题,因为它返回以下内容:

主线程中的异常 "main" java.lang.NoClassDefFoundError:io/javalin/Javalin 在 products.ProductAPI.main(ProductAPI.java:7) Caused by: java.lang.ClassNotFoundException: io.javalin.Javalin 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)


尝试编译组 'io.javalin:javalin:1.3.0'。 - The Guest
尝试了一下,不幸的是它没有起作用。 - Marc Zaharescu
1个回答

6

为了避免出现NoClassDefFoundError错误,您需要在运行时类路径中添加依赖项。创建一个fat jar包是最简单的解决方案。请按照以下方式更改您的jar部分:

jar {
    manifest {
       attributes(
          'Class-Path': configurations.compile.files.collect {"$it.name"}.join(' '),
          'Main-Class': 'products.ProductAPI')}
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

运行 gradle build 命令,就可以创建带有依赖项的 jar 包。 另一种方法是使用 java -cp 标志将 jar 包添加到运行时类路径中。(如果您的应用程序已经配置了一个 classpath 文件夹,将依赖项复制到该文件夹中将会将它们添加到 classpath 中)


如果依赖项已配置为实现范围,则可以使用以下命令创建fat jar:https://dev59.com/questions/hFUM5IYBdhLWcg3wIddd#49284432 - miskender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接