2009-09-22 37 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

相关问题