在创建具有所有依赖项的jar时,Gradle会对目录名称进行清除

时间:2014-05-31 15:34:21

标签: java groovy gradle

这是我的任务:

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文件,发现有几个软件包被挖了出来。这是我找到的文件夹结构:

enter image description here

知道为什么会这样做吗?这个任务是基于一个常见的,我发现如何使用Gradle构建一个包含所有依赖项的jar。

1 个答案:

答案 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。)