可选的Ant arg

时间:2011-02-25 07:47:18

标签: ant properties arguments

我希望包含一个ant arg值,而不必制作2个目标,除了额外的arg之外基本相同。例如:

<target name="A" depends="C">...</target>

<target name="B" depends="C">...</target>

<target name="C">
    <java fork="true" ...>
        <jvmarg .../>
        <arg .../>
        <arg .../>
        ...
        # now, if the dependency is from A, no more args
        # if from B
            <arg value="xxx"/>
    </java>
</target>

1 个答案:

答案 0 :(得分:3)

您可以使用Antcall任务将depend参数作为B传递,而不是param任务C。

<target name="A" >
  <antcall target="C" />
  ....
</target>

<target name="B" >
  <antcall target="C" >
    <param name="extra_arg" value="xxx" />
  </antcall>
  ...
</target>

<target name="C">
    <java fork="true" ...>
        <jvmarg .../>
        <arg .../>
        <arg .../>
        <arg value="${extra_arg}"/>
    </java>
</target>

编辑:正如Nico在评论中指出的那样,如果从A中取消设置该值,则不起作用。可以扩展答案以使用condition任务将参数设置为空字符串。 / p>

<condition property="argToUseIfFromB" else="">
  <isset property="extra_arg" />      
</condition>
<java fork="true" ...>
    <jvmarg .../>
    <arg .../>
    <arg .../>
    <arg value="${argToUseIfFromB}"/>
</java>

进一步编辑: 由于我们无法将参数识别为可选参数,因此我们可以从每个父任务传递整个命令行。目标A只会传递共同的论点; B会通过额外的论证。 arguments上的Ant手册对我的解释比我好。

<target name="A" >
  <antcall target="C">
    <param name="java_args" value="arg_a arg_b" /> 
  </antcall>
  ....
</target>

<target name="B" >
  <antcall target="C" >
    <param name="java_args" value="arg_a arg_b extra_arg" />
  </antcall>
  ...
</target>

<target name="C">
    <java fork="true" ...>
        <jvmarg .../>
        <arg line="${java_args}"/>
    </java>
</target>