一位同事和我通过查看<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 1.8+,因为在该版本中添加了<mappedresources>
。
我要发表一些意见,以蚂蚁的邮件列表,并提出了几个增强:
- 允许时,它被用来作为
ResourceCollection
被指定的资源名称作为一个属性上<concat>
。
- 如果调用
getName()
而没有指定值,则抛出异常(并且不要创建合成值)。
- 最后,虽然不直接相关,但我希望
<expandproperties>
可能需要<propertyset>
,所以我可以控制哪些属性被替换。
最终的zip文件将包含多个文件,我使用的是''(未在我的示例中显示)。我希望使用''与指定的''(也未显示)来执行属性替换的一个文件。我所给出的例子根本不起作用,因为我预计它将基于您引用的文档,而不考虑添加任何其他文件或进行属性替换。 –
2011-03-31 18:05:58
非常感谢。你的期望不清楚原来的问题,但我现在明白了。我在zip里玩了一下concat。行为很奇怪。 – sudocode 2011-04-01 08:15:21