2011-02-25 13 views
6

Me gustaría tener un valor ant arg opcionalmente incluido sin tener que hacer 2 objetivos que serían básicamente los mismos excepto por el arg extra. Por ejemplo:Opcional Ant 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> 
+0

puede probar la declaración 'a menos'. Soy un poco nuevo para mí, así que no estoy seguro si esto funcionará para args, pero para muchas tareas sí lo hace. Parece: args.allset es una propiedad que puedes definir como 'true' en un objetivo y 'false' en otro – kostja

Respuesta

3

En lugar de depend ing en la tarea C, se puede utilizar la tarea Antcall para pasar el argumento B como 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> 

EDIT: Como Nico señala en el comentario, esto no funciona si el valor no está definido de A. La respuesta se puede extender a utilizar la tarea condition para establecer el argumento de una cadena nula.

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

hacer otras modificaciones: Puesto que no podemos obtener los argumentos para ser reconocidos como opcional, podemos pasar toda la línea de comandos de cada tarea padre. Target A solo pasaría los argumentos comunes; B pasaría por un argumento extra. El manual de Ant en arguments lo explica mejor que yo.

<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> 
+0

No, esto no no trabajo. Cuando A llama a C lanzará un error, ya que no se definió * extra_arg * en esa etapa. Funciona bien cuando B llama a C. –

+0

@Nico: tiene toda la razón. ¿Esta edición es mejor? – DoctorRuss

+0

Todavía no. Hace lo mismo que tu original. Decir que '' no es un argumento válido. Parece que incluso si es nulo, intenta forzarlo como argumento. –