【问题标题】:How to pass multiple parameters to a target in Ant?如何将多个参数传递给 Ant 中的目标?
【发布时间】:2016-06-21 21:28:00
【问题描述】:

我有这个虚拟目标:

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

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

对于第一个参数说 abc="test",上面的代码将创建一个 test 目录并将战争放入其中。同样对于 xyz="production" 它会创建一个文件夹 production并将war文件放入其中。

我尝试过使用

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

在依赖于上面提供的虚拟目标的目标中。 这是正确的方法吗?我想一定有某种方法可以传递多个参数,然后一次循环一个参数。

【问题讨论】:

  • 为什么需要两个参数?难道不能定义一个参数“env”并将其设置为“test”或“production”吗?
  • 这两个参数不是必须的,我只需要达到上面指定的目标。如果你能提供更好的解决方案,不胜感激:)

标签: ant


【解决方案1】:

不幸的是,除非您引用文件,否则 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 的第二个解决方案。您可以将所有逻辑封装到一个宏定义中,然后简单地调用它两次。在任何情况下,您都需要在构建文件中的某个位置写入这两个参数。我认为没有任何方法可以在不使用外部 .jar 或 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>

【讨论】:

    【解决方案2】:

    我承认我没有详细理解这个问题。 ${project.stage} 是否与xyzabc 参数相同?而为什么只提到了两个参数xyzabc,而应该只替换“发布”这个词?

    知道的是,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
    

    也许我们可以从这里开始,根据需要修改这个例子。

    【讨论】:

    • 是和否 - 是的:我承认,我没有注意到您的答案的更新。 No-Part:不涉及antcall。我不能说这是提问者想要还是不想要的东西。我们会看到。如果没有,我将删除我的答案。
    • 好吧,我不能怪你。这个问题比较模糊。您不必删除任何内容。我们都在努力提供帮助。
    • @A.H. ${project.stage} 与 abc 或 xyz 不同。这是其他一些目录,比如 C:/mydrive/antbuilds,我使用它来避免通过构建文件进行硬编码。现在,在此之后,我想在 antbuilds 文件夹中创建两个不同的目录,文件夹的名称将是我将传递的参数的值,在这种情况下为 abc 和 xyz。abc 和 xyz 的值将替换 release,我将得到的是:C:/mydrive/antbuilds/abc 的值 & C:/mydrive/antbuilds/xyz 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多