【问题标题】:Java Gradle Build: NoClassDefFoundErrorJava Gradle 构建:NoClassDefFoundError
【发布时间】:2018-08-13 07:51:15
【问题描述】:

我的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 有一些问题,因为它返回以下内容:

线程“主”java.lang.NoClassDefFoundError 中的异常: io/javalin/Javalin 在 products.ProductAPI.main(ProductAPI.java:7) 引起:java.lang.ClassNotFoundException: io.javalin.Javalin at 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'
  • 试过了,可惜没用

标签: java heroku gradle build dependencies


【解决方案1】:

要在没有任何NoClassDefFoundError 的情况下运行您的应用程序,您应该在运行时类路径中包含您的依赖项。创建一个胖罐子是最简单的解决方案。如下更改您的 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 标志。 (另外如果你的应用已经配置了类路径文件夹,复制这个文件夹中的依赖项会将它们添加到类路径中)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多