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

如何将其他Gradle任务的输出文件引用为ziptree?,gradle,proguard,shadowjar,Gradle,Proguard,Shadowjar,我有一个ShadowJar和一个Proguard任务,在我的Gradle构建中生成两个jar文件 task obfuscate(type: ProguardTask) { outjars .. } shadowJar { ... } task release(type: Jar) { from shadowJar from obfuscate classifier 'all' } 我的问题是,在本例中,发布jar文件包含阴影jar和模糊jar文件,作为jar本身中的两个

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

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

shadowJar {
  ...
}

task release(type: Jar) {
  from shadowJar
  from obfuscate
  classifier 'all'
}
我的问题是,在本例中,发布jar文件包含阴影jar和模糊jar文件,作为jar本身中的两个文件。我想把它们作为zipTree输入

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

我尝试从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文档

创建包含给定ZIP文件内容的新文件树。给定的zipPath路径根据Project.file(java.lang.Object)进行计算

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

您可以假定任务是提供仅包含一个文件的文件集合。在这种情况下,您只需采用您的方法并使用
getSingleFile
方法:

from zipTree(shadowJar.outputs.files.singleFile)
只要使用类型为
Jar
的任务,这就不会导致任何问题,因为任何此类任务都只会创建一个Jar文件。但是,如果使用其他任务类型(可能有多个输出文件)(例如自定义任务),则
getSingleFile
方法将失败

第二种方法是迭代每个输出文件,将其解压,并通过
from
添加显示的内容:

shadowJar.outputs.files.each { outFile ->
    from zipTree(outFile)
}
我不太确定以下方法是否有效,但这可能是一种更具渐变风格的解决方案:

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

非常感谢。这似乎更好,但现在我找不到参数[foo/bar/myjar-2017.05.05-all.jar,build_5mt3ethz91ji36qb1vfayplhl$的方法zipTree()$_closure31@28108b8]类型为org.gradle.api.tasks.bundling.Jar的on task':release.So zipTree似乎收到了shadow Jar输出文件名我有点困惑,因为
zipTree
方法似乎同时接收字符串和闭包。你试过哪个例子?哦,我的错。我想在闭包中为zipTree指定一个排除项,这只是造成这种情况的原因。