如何将多个参数传递给Ant中的目标?

EMM*_*EMM 4 ant

我有这个虚拟目标:

<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)

在目标中,取决于上面提供的虚拟目标.这是正确的方法.我想必须有一些方法来传递多个参数,然后一次循环一个参数.

Fai*_*Dev 5

不幸的是,除非你引用文件,否则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)