首页 文章

Java Gradle Build:NoClassDefFoundError

提问于
浏览
2

我的 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 at products.ProductAPI.main(ProductAPI.java:7)引起:java.lang.ClassNotFoundException:io.javalin.Javalin at java.net . java.lang.ClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:338)at java.lang.ClassLoader.loadClass (ClassLoader.java:357)

1 回答

  • 6

    要在没有任何 NoClassDefFoundError 的情况下运行您的应用程序,您应该在运行时类路径中拥有依赖项 . 创建一个胖 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将创建依赖项 . 其他方法是将jar添加到运行时类路径中;与 java -cp 标志 . (另外,如果您的应用程序已经配置了类路径文件夹,则复制此文件夹中的依赖项会将它们添加到类路径中)

相关问题