如何将其他Gradle任务的输出文件称为Ziptree



我有一个影子jar和一个proguard任务,在我的gradle build中产生两个jar文件。

task obfuscate(type: ProguardTask) {
  outjars ..
}
shadowJar {
  ...
}
task release(type: Jar) {
  from shadowJar
  from obfuscate
  classifier 'all'
}

我的问题是,在这种情况下,发行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.

如何正确参考上述任务的输出jar文件?

zipTree上的gradle文档:

创建一个新的Filetree,其中包含给定ZIP文件的内容。根据project.file(java.lang.Object(评估给定的Zippath路径。

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

您可以假设仅提供一个只有一个文件的文件集合。在这种情况下,您可以简单地采用您的方法并使用getSingleFile方法:

from zipTree(shadowJar.outputs.files.singleFile)

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

第二种方法是在每个输出文件上迭代,解压缩它,然后通过from添加显示的内容:

shadowJar.outputs.files.each { outFile ->
    from zipTree(outFile)
}

我不太确定以下是有效的,但也许是一个更多的gradle式解决方案:

from shadowJar.outputs.files.collect{ zipTree(it) }

最新更新