这是我的任务:
task uberJar(dependsOn: [classes], type: Jar) {
from files(sourceSets.main.output.classesDir)
from files(sourceSets.main.output.resourcesDir)
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes 'Main-Class': 'cli'
}
}
这是一个非常简单的项目,只需将一个groovy脚本构建到一个自包含的可执行jar文件中。我知道Groovy代码有效。当我试图在生成的jar文件上运行java -jar
时,它说它找不到我知道包含的文件。所以我扩展了jar文件,发现有几个软件包被挖了出来。这是我找到的文件夹结构:
知道为什么会这样做吗?这个任务是基于一个常见的,我发现如何使用Gradle构建一个包含所有依赖项的jar。
答案 0 :(得分:1)
Jar内容看起来正确。大多数(如果不是所有的)顶级目录都来自groovy-all
,这显然是代码的依赖关系。除非使用自定义类加载器,否则JVM不会从嵌套的Jars(change-password.jar
)加载类。
使用不以大写字母(cli
)开头的类名可能会导致Groovy出现问题。更重要的是,合并罐子通常不安全,并且可能导致微妙的问题。创建自包含可执行文件Jar的更好方法是使用gradle-one-jar插件。
PS:应使用from
而不是前两行from sourceSets.main.output
。然后,也可以删除明确的dependsOn
(顺便提一下processResources
,这将解释缺少的资源文件)。如果您不需要常规Jar,则可以重新配置jar
任务,而不是添加uberJar
任务。 (如果你这样做,省略from sourceSets.main.output
。)