13

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

4

3 回答 3

17

您可以使用zipfileset带有fullpath属性的 a 来重命名 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目标将它们全部全局化:

<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> 
于 2009-09-26T23:43:42.767 回答
2

更新:您可能实际上想要复制任务而不是移动,但正则表达式映射器对复制和移动的工作方式相同。

下面的正则表达式会将jars目录下的所有jars复制到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 才能工作。有多种实现可供选择:

于 2009-09-22T14:32:07.750 回答
2

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

例如,假设除了想要

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

在输出 JAR 中,您还有一个目录stuff/,其中包含一些文件和子目录。如果您想将 的内容stuff/包含在 JAR 中,但又想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 开始抛出 a NullPointerException,请参阅Bug 54026

于 2012-10-18T23:33:14.850 回答