我有这个虚拟目标:
<mkdir dir="${project.stage}/release
<war destfile="${project.stage}/release/sigma.war">
...
...
</war>
Run Code Online (Sandbox Code Playgroud)
我想要做的是提供两个参数,例如"abc"和"xyz",它们将分别用abc和xyz参数的值替换单词release.
对于第一个参数说abc ="test",上面的代码将创建一个测试目录并将war放入其中.类似于xyz ="production",它将创建一个文件夹生成并将war文件放入其中.
我通过使用尝试了这个
<antcall target="create.war">
<param name="test" value="${test.param.name}"/>
<param name="production" value="${prod.param.name}"/>
</antcall>
Run Code Online (Sandbox Code Playgroud)
在目标中,取决于上面提供的虚拟目标.这是正确的方法.我想必须有一些方法来传递多个参数,然后一次循环一个参数.
不幸的是,除非你引用文件,否则ant不支持像for或foreach循环这样的迭代.然而,ant contrib任务可以解决大多数(如果不是全部)迭代问题.
您必须首先按照此处的说明安装.jar:http://ant-contrib.sourceforge.net/#install
这应该需要大约10秒钟.在您可以简单地使用foreach任务迭代自定义列表之后.作为示例,您可以按照以下build.xml文件:
<project name="test" default="build">
<!--Needed for antcontrib-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<target name="build">
<property name="test" value="value_1"/>
<property name="production" value="value_2"/>
<!--Iterate through every token and call target with parameter dir-->
<foreach list="${test},${production}" param="dir" target="create.war"/>
</target>
<target name="create.war">
<echo message="My path is : ${dir}"/>
</target>
</project>
Run Code Online (Sandbox Code Playgroud)
输出:
build:
create.war:
[echo] My path is : value_1
create.war:
[echo] My path is : value_2
BUILD SUCCESSFUL
Total time: 0 seconds
Run Code Online (Sandbox Code Playgroud)
我希望它有帮助:)
不使用ant contrib的第二种解决方案.您可以将所有逻辑封装到macrodef中,然后只需调用它两次.在任何情况下,您都需要在构建文件中的某个位置编写这两个参数.我认为没有任何方法可以在不使用外部.jars或BSF语言的情况下迭代属性.
<project name="test" default="build">
<!--Needed for antcontrib-->
<macrodef name="build.war">
<attribute name="dir"/>
<attribute name="target"/>
<sequential>
<antcall target="@{target}">
<param name="path" value="@{dir}"/>
</antcall>
</sequential>
</macrodef>
<target name="build">
<property name="test" value="value_1"/>
<property name="production" value="value_2"/>
<build.war dir="${test}" target="create.war"/>
<build.war dir="${production}" target="create.war"/>
</target>
<target name="create.war">
<echo message="My path is : ${path}"/>
</target>
</project>
Run Code Online (Sandbox Code Playgroud)