如何通过ant的jar任务包含在jar中重命名文件?

时间:2009-09-22 14:25:33

标签: ant jar mapper

我想把一组看起来像这样的文件放到一个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时应用映射器,或者如何执行这样的转换?我想避免将所有文件复制到我想要的目录结构中,并在整个地方制作副本,这就是我们的构建系统现在的工作方式。

3 个答案:

答案 0 :(得分:17)

您可以使用zipfileset fullpath属性重命名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>

你不能使用这种技术的mapper,你必须明确列出每个jar文件。如果您可以假设每个文件都被命名为my.jar,并且它们都在一个直接的子目录中,那么您可以使用subant目标将它们全部展开:

<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> 

答案 1 :(得分: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>

regexp映射器需要在类路径上使用适当的regexp实现jar才能工作。可以使用各种实现:

答案 2 :(得分:2)

如果您不想(或不能轻易)单独列出每个文件,一种解决方案是使用Zip任务,该任务允许嵌套<mappedresources>(Ant 1.8.0+)。 Zip任务完成后,您可以使用Jar任务添加/更新清单和/或添加索引。

例如,假设除了想要

之外
yay_my.jar
boo_my.jar
foo_my.jar
bar_my.jar

在输出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"/>

我测试了这个构建文件,它适用于Ant 1.8.2。但是,如果在更改之后Ant开始抛出NullPointerException,请参阅Bug 54026