2009-09-22 38 views
13

我希望把一組文件看起來像這樣成jar:如何通過ant的jar任務將文件包含在jar中時重命名文件?

yay/my.jar 
boo/my.jar 
foo/my.jar 
bar/my.jar 

在這個過程中,我希望將他們都改名如下:

yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

我希望能使用一個映射器來實現這一點,但我使用的文件集元素和jar任務似乎不支持任何地方。

如何在構建jar時應用mapper,否則我該如何執行轉換?我想避免將所有文件複製到我想要的目錄結構,並在所有位置重複,這就是我們的構建系統現在的工作方式。

回答

2

更新:您可能實際上想要copy task而不是移動,但regexp mapper對於複製和移動都適用。

下面的正則表達式會將jars目錄中的所有jar複製到jars_out,將[folder]/[file] .jar映射到[folder] _ [file] .jar。

<copy todir="./jars_out"> 
    <fileset dir="jars"/> 
    <mapper type="regexp" from="([^/\\]*)[/\\](.*)\.jar$$" to="\1_\2.jar"/> 
</copy> 

正則表達式映射器需要類路徑上適當的正則表達式實現jar來工作。各種實現方式可供選擇:

+0

我加入了一個例子來說明如何 – 2009-09-22 14:33:28

+0

這是偉大的,但並沒有完成我的建築罐子未做文件的額外副本的目標。移動會避免複製,但是每次構建時都將重新生成罐子,而不僅僅是源文件已更改。 – skiphoppy 2009-09-22 16:27:29

+0

但是,你建立的映射器標籤是真棒,我會在借款而不是來了我自己的一個。 :)我還沒有得到足夠遠的實際構建我需要但因爲我無法在所有得到任何映射器文件集和jar工作映射器。 – skiphoppy 2009-09-22 16:28:19

17

您可以使用zipfilesetfullpath屬性重命名的jar文件名:

<jar destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 
</jar> 

你不能使用一個使用這種技術的映射器,你必須明確地列出每個jar文件。如果你可以假設每一個文件名爲my.jar,而且都是在直接子目錄,你可以使用subant目標他們glob的全部了:

<target name="glom"> 
    <subant genericantfile="${ant.file}" target="update-jar"> 
     <dirset dir="." includes="*"/> 
    </subant> 
</target> 

<target name="update-jar"> 
    <basename file="${basedir}" property="dirname"/> 
    <property name="path" value="${dirname}_my.jar"/> 
    <jar destfile="../newjar.jar" update="yes"> 
     <zipfileset dir="." includes="my.jar" fullpath="${path}"/> 
    </jar> 
</target> 
+0

+1在jar任務期間重命名文件的簡單方法。謝謝。 – Damo 2011-09-09 05:40:24

2

如果你不想(或可不容易)單獨列出每個文件,一種解決方案是使用Zip任務,該任務允許嵌套<mappedresources>(Ant 1.8.0+)。一旦Zip任務完成,您可以使用Jar任務添加/更新清單和/或添加索引。

假設,例如,除了在輸出JAR想

 
yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

,你也有一個目錄stuff/,包含了一些文件和子目錄。如果你想包括在JAR stuff/的內容,但你要stuff/subdir/*被添加爲other_subdir/*,考慮以下因素:

<zip destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 

    <mappedresources> 
     <fileset dir="stuff"/> 
     <compositemapper> 
      <globmapper from="subdir/*" to="other_subdir/*"/> 
      <identitymapper/> 
     </compositemapper> 
    </mappedresources> 
</zip> 
<!-- Update the newly-created ZIP in-place to add a basic manifest --> 
<jar destfile="newjar.jar" update="true"/> 

我測試了構建文件,並將其與螞蟻1.8.2工作。但是,如果改變後它開始投擲NullPointerException,請參閱Bug 54026

相關問題