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