【问题标题】:Gradle munges directory names while creating a jar with all dependenciesGradle munges 目录名称,同时创建一个包含所有依赖项的 jar
【发布时间】:2014-07-21 05:27:05
【问题描述】:

这是我的任务:

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。

【问题讨论】:

    标签: java groovy gradle


    【解决方案1】:

    Jar 内容看起来正确。大多数(如果不是全部)描述的顶级目录来自groovy-all,这显然是您的代码的依赖项。除非使用自定义类加载器,否则 JVM 不会从嵌套的 Jars (change-password.jar) 加载类。

    使用不以大写字母 (cli) 开头的类名可能会导致 Groovy 出现问题。更重要的是,合并 Jars 通常并不安全,可能会导致一些微妙的问题。创建自包含可执行 Jar 的更好方法是使用 gradle-one-jar 插件。

    PS:应该使用from sourceSets.main.output 而不是前两行from。然后显式的dependsOn(顺便说一下缺少processResources,这将解释缺少resource 文件)也可以被删除。如果您不需要常规 Jar,则可以重新配置 jar 任务,而不是添加 uberJar 任务。 (如果你这样做,请省略from sourceSets.main.output。)

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2018-06-30
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多