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

ski*_*ppy 13 ant jar mapper

我想把一组看起来像这样的文件放到一个jar中:

yay/my.jar
boo/my.jar
foo/my.jar
bar/my.jar
Run Code Online (Sandbox Code Playgroud)

在这个过程中,我希望所有这些都重命名如下:

yay_my.jar
boo_my.jar
foo_my.jar
bar_my.jar
Run Code Online (Sandbox Code Playgroud)

我希望使用映射器来实现这一点,但我使用的文件集元素和jar任务似乎并不支持它.

如何在构建jar时应用映射器,或者如何执行这样的转换?我想避免将所有文件复制到我想要的目录结构中并在整个地方制作副本,这就是我们的构建系统现在的工作方式.

Jas*_*Day 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>
Run Code Online (Sandbox Code Playgroud)

但是,您无法使用此技术的映射器,您必须明确列出每个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> 
Run Code Online (Sandbox Code Playgroud)


Ric*_*ler 2

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

以下正则表达式会将 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>
Run Code Online (Sandbox Code Playgroud)

正则表达式映射器需要类路径上有适当的正则表达式实现 jar 才能工作。有多种实现方式可供选择: