成功的Gradle项目构建在运行时生成NoClassDefFoundError

时间:2017-02-21 19:24:56

标签: java gradle

我正在使用Gradle在Eclipse中构建我的Java项目。 gradle.build如下

apply plugin: 'java'
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.0'
    compile group: 'org.reflections', name: 'reflections', version: '0.9.10'
}

通过Eclipse运行时,所有库都能正常运行。但有时在命令行上工作很有用。在命令行上运行时,即使构建成功并且代码包含从这些库的导入,也会发生运行时错误Exception in thread "main" java.lang.NoClassDefFoundError: com/flowpowered/nbt/regionfile/SimpleRegionFileReader。我尝试过清理和重建,以及gradlew build --refresh-dependencies,但我仍遇到相同的运行时错误。

我会假设这些库从未真正导入过?或者他们没有存储在java项目认为的位置?我对Gradle不熟悉,所以欢迎提出任何建议。

2 个答案:

答案 0 :(得分:2)

根据发布的build.gradle文件,您没有将应用程序打包为可执行JAR。

首先应用application插件。但这还不够,因为您无法在没有所有依赖项的情况下将可执行文件作为单个JAR运行。也应用shadow插件。

这两个插件可让您访问以下任务:

  • run:从gradle的命令行执行应用程序。
  • runShadow:执行应用程序,但所有依赖项都打包在一个JAR中,以及已编译的类和资源。
  • shadowJar:创建一个"胖JAR"使用已编译的类和所有依赖项。

因此,您的build.gradle可能看起来像这样

plugins {
    id 'java'
    id 'application'
    id 'com.github.johnrengelman.shadow' version '1.2.4'
}
mainClassName = 'com.acme.YourMainClassName'
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.0'
    compile group: 'org.reflections', name: 'reflections', version: '0.9.10'
}

插件文档:

答案 1 :(得分:0)

另一种解决方案,不使用任何插件,最终仍然使用可运行的胖罐

jar {
    archiveName = 'NameOfYourApp.jar'

    manifest {
        attributes 'Main-Class': 'uk.co.cdl.Main',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': project.version
    }

    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
    include/exclude anything if need to if not take the curlys off 
    }
}