可选的Ant arg

Nic*_*men 6 ant arguments properties

我希望可以选择包含一个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>
Run Code Online (Sandbox Code Playgroud)

Doc*_*uss 3

您可以depend使用Antcall任务将B参数作为param.

<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>
Run Code Online (Sandbox Code Playgroud)

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

<condition property="argToUseIfFromB" else="">
  <isset property="extra_arg" />      
</condition>
<java fork="true" ...>
    <jvmarg .../>
    <arg .../>
    <arg .../>
    <arg value="${argToUseIfFromB}"/>
</java>
Run Code Online (Sandbox Code Playgroud)

进一步编辑:由于我们无法将参数识别为可选,因此我们可以从每个父任务传递整个命令行。TargetA只会传递常见的参数;B将通过一个额外的参数。关于参数的 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>
Run Code Online (Sandbox Code Playgroud)