我正在尝试将<concat>
用作<zip>
任务中的资源集合,并且根据文档,这应该可行。我想这样做是因为我想要包含在zip中的一些文件需要扩展一些属性,所以我还会在<filterchain>
添加<concat>
来执行此操作。我更喜欢直接这样做而不是复制到临时位置(使用属性替换)并在zip文件中包含副本。
但是,我似乎无法让<zip>
正确使用<concat>
元素。
到目前为止我所拥有的一个简化示例:
<zip destfile="target/dist.zip">
<concat>
<fileset file="CHANGES.txt" />
</concat>
</zip>
这会创建一个包含多个名为concat (C:
的目录的zip文件(显然这是在Windows机器上)。
我错过了什么?
答案 0 :(得分:3)
一位同事和我通过查看<zip>
和<concat>
来源找到了答案。确实有两个答案:
<concat>
ResourceCollection
接口的实现很奇怪,但我们理解为什么。对于#1,虽然<concat>
是ResourceCollection
(如FileSet
),但它会返回单个Resource
的名称,它包含硬编码值:
"concat (" + String.valueOf(c) + ")";
看起来很熟悉?
通常会忽略资源名称 - 除<zip>
及其相关任务外,它们使用资源名称作为ZipEntry
名称。由于<concat>
返回奇怪的名称,这就是我们在zip文件中获得的内容。
我还没弄清楚为什么我会得到多个条目,但这并不重要:观察会导致一个复杂的解决方案。
由于我知道要创建的ZipEntry
的名称,因此我可以使用<mapper>
为<concat>
资源命名。这就是我想到的所有荣耀:
<zip destfile="target/distribution.zip">
<fileset dir=".">
<exclude name="target/**" />
<exclude name="CHANGES.txt" />
</fileset>
<mappedresources>
<concat>
<fileset file="CHANGES.txt" />
<filterchain>
<expandproperties />
</filterchain>
</concat>
<mergemapper to="CHANGES.txt" />
</mappedresources>
</zip>
正如我的同事所说:“在Ant中,每个问题都可以使用映射器解决。”
这仅适用于Ant 1.8+,因为在该版本中添加了<mappedresources>
。
我将在Ant邮件列表中发布一些评论并提出一些改进建议:
<concat>
用作ResourceCollection
时,允许将资源名称指定为getName()
上的属性。<expandproperties>
,则抛出异常(并且不创建合成值)。<propertyset>
可以使用{{1}},以便我可以控制哪些属性被替换。答案 1 :(得分:0)
您希望最终的zip包含单个文件还是多个文件?据我所知,使用concat(成功完成,上面没有完成)会生成一个文件,这是资源集合中所有文件连接的结果。
如果你想要多个文件而不是连接,我认为中间副本就是你需要的。
来自Ant手册的concat任务:
自Apache Ant 1.7.1以来,此任务可以 用作资源集合 将只返回一个资源。