如何将其他 Gradle 任务的输出文件引用为 ziptree?

jab*_*bal 4 proguard gradle shadowjar

我有一个 ShadowJar 和一个 Proguard 任务,它们在我的 Gradle 构建中生成两个 jar 文件。

task obfuscate(type: ProguardTask) {
  outjars ..
}

shadowJar {
  ...
}

task release(type: Jar) {
  from shadowJar
  from obfuscate
  classifier 'all'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在这种情况下,发布 jar 文件包含影子 jar 和混淆的 jar 文件,作为 jar 本身中的两个文件。我想将它们作为 zipTree 输入。

我的问题是我不知道如何将任务引用转换为该任务实际输出的 zipTree。

我的尝试引导我,from zipTree(shadowJar.outputs.getFiles())但这仍然失败:

> Cannot convert the provided notation to a File or URI: task 'shadowJar' output files.
  The following types/formats are supported:
    - A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
    - A String or CharSequence URI, for example 'file:/usr/include'.
    - A File instance.
    - A URI or URL instance.
Run Code Online (Sandbox Code Playgroud)

如何正确引用上述任务的输出 jar 文件?

Luk*_*fer 5

Gradle 文档zipTree

创建一个新的 FileTree,其中包含给定 ZIP 文件的内容。给定的 zipPath 路径根据 Project.file(java.lang.Object) 进行评估。

因此,zipTree只能处理单个文件,但outputs.files提供了文件集合。这揭示了两个选择:

您可以承担提供仅包含一个文件的文件集合的任务。在这种情况下,您可以简单地采用您的方法并使用以下getSingleFile方法:

from zipTree(shadowJar.outputs.files.singleFile)
Run Code Online (Sandbox Code Playgroud)

只要您使用 类型的任务Jar,这就不应该引起任何问题,因为这种类型的任何任务都只会创建一个 jar 文件。但如果您使用其他任务类型,可能有多个输出文件(例如自定义任务),该getSingleFile方法将失败。

第二种方法是迭代每个输出文件,解压缩它并通过以下方式添加显示的内容from

shadowJar.outputs.files.each { outFile ->
    from zipTree(outFile)
}
Run Code Online (Sandbox Code Playgroud)

我不太确定以下是否有效,但也许它是一个更加 Gradle 风格的解决方案:

from shadowJar.outputs.files.collect{ zipTree(it) }
Run Code Online (Sandbox Code Playgroud)