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

时间:2011-09-26 08:44:29

标签: ant

我有这个虚拟目标:

<mkdir dir="${project.stage}/release 
<war destfile="${project.stage}/release/sigma.war">
    ...
    ...
  </war>

我想要做的是提供两个参数说“abc”&amp; “xyz”将分别用abc和xyz参数的值替换 release 这个词。

对于第一个参数说abc =“test”,上面的代码将创建一个 test 目录并将war放入其中。类似于xyz =“production”它将创建一个文件夹生产并将war文件放入其中。

我尝试使用

<antcall target="create.war">
    <param name="test" value="${test.param.name}"/>
    <param name="production" value="${prod.param.name}"/>
</antcall>

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

2 个答案:

答案 0 :(得分: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>

输出:

build:

create.war:
 [echo] My path is : value_1

create.war:
 [echo] My path is : value_2

BUILD SUCCESSFUL
Total time: 0 seconds

我希望它有所帮助:)

不使用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>

答案 1 :(得分:1)

我承认我不明白这个问题。 ${project.stage}xyzabc参数相同吗?为什么有两个参数 xyzabc,只有“release”这个词应该被替换?

知道的是,macrodef (docu)是非常通用的东西,它可能在这里很有用:

<project name="Foo" default="create.wars">

    <macrodef name="createwar">
        <attribute name="stage" />
        <sequential>
            <echo message="mkdir dir=@{stage}/release " />
            <echo message="war destfile=@{stage}/release/sigma.war" />
        </sequential>
    </macrodef>

    <target name="create.wars">
        <createwar stage="test" />
        <createwar stage="production" />
    </target>
</project>

输出将是:

create.wars:
     [echo] mkdir dir=test/release 
     [echo] war destfile=test/release/sigma.war
     [echo] mkdir dir=production/release 
     [echo] war destfile=production/release/sigma.war

也许我们可以从这里开始并根据需要调整这个例子。