2011-03-31 88 views
1

我試圖使用<concat>作爲<zip>任務中的資源集合,根據文檔,這應該起作用。我想這樣做是因爲我想在zip中包含的某些文件需要擴展某些屬性,所以我還會將<filterchain>添加到<concat>中來執行此操作。我寧願直接做,而不是複製到臨時位置(使用屬性替換),並將副本包含在zip文件中。concat作爲zip中的資源集合不起作用?

但是,我似乎無法得到<zip>正確使用<concat>元素。

什麼,我至今一個簡單的例子:

<zip destfile="target/dist.zip"> 
    <concat> 
     <fileset file="CHANGES.txt" /> 
    </concat> 
</zip> 

這將創建一個包含多個目錄中所有命名concat (C:(顯然這是在Windows機器上)的zip文件。

我錯過了什麼?

回答

3

一位同事和我通過查看<zip><concat>來源得出答案。確實有兩個答案:

  1. <concat>的執行ResourceCollection界面很奇怪,但我們明白爲什麼。
  2. 有一種解決方法。

對於#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>

我要發表一些意見,以螞蟻的郵件列表,並提出了幾個增強:

  1. 允許時,它被用來作爲ResourceCollection被指定的資源名稱作爲一個屬性上<concat>
  2. 如果調用getName()而沒有指定值,則拋出異常(並且不要創建合成值)。
  3. 最後,雖然不直接相關,但我希望<expandproperties>可能需要<propertyset>,所以我可以控制哪些屬性被替換。
0

你想讓最終的zip包含單個文件或多個文件嗎?就我所見,使用concat(成功完成時,上面沒有完成)將生成一個文件,即資源集合中所有文件連接的結果。

如果你想要多個文件而不是連接,我認爲你需要中間拷貝。

從爲CONCAT任務Ant手冊:

由於Apache Ant的1.7.1,這個任務可以 作爲一個資源集合, 將返回一資源。

+0

最終的zip文件將包含多個文件,我使用的是''(未在我的示例中顯示)。我希望使用''與指定的''(也未顯示)來執行屬性替換的一個文件。我所給出的例子根本不起作用,因爲我預計它將基於您引用的文檔,而不考慮添加任何其他文件或進行屬性替換。 – 2011-03-31 18:05:58

+0

非常感謝。你的期望不清楚原來的問題,但我現在明白了。我在zip裏玩了一下concat。行爲很奇怪。 – sudocode 2011-04-01 08:15:21