我当前的构建文件具有以下重复性任务:
<jar jarfile="${build.lib}/${prefix}-foo.jar">
<fileset dir="${build.classes}">
<include name="com/a/c/foo/**"/>
</fileset>
</jar>
<jar jarfile="${build.lib}/${prefix}-bar.jar">
<fileset dir="${build.classes}">
<include name="com/a/c/bar/**"/>
</fileset>
</jar>
...等问题是必须为每个新包或每个新子项修改build.xml。这种情况经常发生在我工作的地方。
我想用可以根据“root”包动态生成JAR及其文件名的逻辑替换它。因此,例如,我可以将根包设置为com / a / c,直接在该包下的所有包都将获得自己的JAR。请注意,“foo”或“bar”下的所有包只是“foo.jar”或“bar.jar”的一部分。
我查找了ANT的循环逻辑任务。我在每个ant-contrib和JWare / AntXtras中找到了一个,但我无法按要求工作。
答案 0 :(得分:4)
我不知道循环并查找所有包名,但您可以使用宏来避免代码重复。
我没试过这个,但它可以工作
<macrodef name="build_jar">
<attribute name="name"/>
<sequential>
<jar jarfile="${build.lib}/${prefix}-@{name}.jar">
<fileset dir="${build.classes}">
<include name="com/a/c/@{name}/**"/>
</fileset>
</jar>
</sequential
</macrodef>
<target name="build_foo">
<build_jar name="foo"/>
</target>
<target name="build_bar">
<build_jar name="bar"/>
</target>
答案 1 :(得分:1)
这个怎么样:
<project name="dynjar" default="jar" basedir=".">
<property name="build.classes" value="${basedir}/classes"/>
<property name="build.lib" value="${basedir}/lib"/>
<property name="prefix" value="prefix"/>
<property name="root" value="com/a/c"/>
<target name="jar">
<!-- ${ant.file} is the name of the current build file -->
<subant genericantfile="${ant.file}" target="do-jar">
<!-- Pass the needed properties to the subant call. You could also use
the inheritall attribute on the subant element above to pass all
properties. -->
<propertyset>
<propertyref name="build.classes"/>
<propertyref name="build.lib"/>
<propertyref name="prefix"/>
<propertyref name="root"/>
</propertyset>
<!-- subant will call the "do-jar" target for every directory in the
${build.classes}/${root} directory, making the subdirectory the
basedir. -->
<dirset dir="${build.classes}/${root}" includes="*"/>
</subant>
</target>
<target name="do-jar">
<!-- Get the basename of the basedir (foo, bar, etc.) -->
<basename file="${basedir}" property="suffix"/>
<jar jarfile="${build.lib}/${prefix}-${suffix}.jar">
<fileset dir="${build.classes}">
<include name="${root}/${suffix}/**"/>
</fileset>
</jar>
</target>
</project>