一位同事和我通過查看<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