我有一个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。
我的尝试引导我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文件?
答案 0 :(得分:1)
zipTree
上的Gradle文档:
创建一个新的FileTree,其中包含给定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)
}
我不太确定以下是否有效,但可能是更加Gradle风格的解决方案:
from shadowJar.outputs.files.collect{ zipTree(it) }