我正在使用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不熟悉,所以欢迎提出任何建议。
答案 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
}
}