turnos simulador puntos matricula licencias ant

simulador - ant turnos



Ejecutar la tarea Ant solo si se cumple una condiciĆ³n (4)

Necesito ejecutar una tarea Ant dentro de un objetivo específico solo si se cumple una condición.

Encontré una manera de definir la condición en el nivel objetivo, pero no en el nivel de tarea. También he encontrado una contribución que implementa una tarea de FI .

Mi pregunta es, ¿conoce alguna forma de lograr este objetivo con las tareas estándar de Ant?

Explicación más larga: estoy intentando iniciar Tomcat Server en caso de que se detenga. Para detectar si está detenido uso el siguiente código:

<echo message="Checking whether Tomcat is running"/> <condition property="tomcat.running"> <socket server="${tomcat.host}" port="${tomcat.port}"/> </condition>

Así que mi próxima tarea en este objetivo es una tarea ejecutable que debe ejecutarse solo si ${tomcat.running} es falso. Y como dije, no quiero agregar una sola tarea en un objetivo para usar la propiedad a menos que.


Desde la versión 1.9.1 (*) ant admite tener las condiciones if- e-menos- de forma más precisa en cualquier tarea , si declara los espacios de nombres necesarios dentro del elemento del proyecto.

(*) Por favor, use la última versión de ant (1.9.6 a partir de este escrito), ya que la versión 1.9.1 contiene fallas WRT esta nueva característica, como el usuario @Rebse señaló amablemente.

En el siguiente ejemplo, puede jugar y comentar / descomentar las propiedades ...

<project name="test" xmlns:if="ant:if" xmlns:unless="ant:unless"> <property name="is.good" value="hohoho"/> <!--property name="hide.base" value="boo"/--> <target name="foo"> <echo unless:set="hide.base">${basedir}</echo> <echo if:set="is.good">GOOD</echo> </target> </project>

... y observe salidas como esta:

Buildfile: D:/test/ant/taskcondition/build.xml foo: [echo] D:/test/ant/taskcondition [echo] GOOD BUILD SUCCESSFUL Total time: 191 milliseconds


Hay situaciones en las que no puede hacer que su objetivo Ant sea dependiente de otro objetivo Ant porque el if debe evaluarse basándose en un valor inicializado justo antes de exec (puedo proporcionar un ejemplo claro, pero por simplicidad no lo haré).

En sistemas similares a Unix, una alternativa (preferible en ciertas situaciones) es la siguiente:

<!-- the property that contains the value to be checked agains IF --> <property name="myprop" value="true"/> <!-- the Ant''s exec combined with OS-IF command --> <exec executable="bash"> <arg value="-c" /> <arg value="if [ &quot;${myprop}&quot; != &quot;$${myprop}&quot;] || [&quot;${tag_exists}&quot; != &quot;true&quot; ]; then my-bash-command _arguments_; fi" /> </exec>

En lo anterior, el comando my-bash ilustra el comando / programa que desea ejecutar y los argumentos ilustran los argumentos para ese comando.

Tenga en cuenta que cuando no se configura el myprop, entonces $ {myprop} simplemente se evaluará con la cadena "$" + "{" + "myprop" + "}" (es decir, "$ {myprop}"), por lo tanto tenemos para comparar el valor de myprop contra esa cadena.

Por otra parte, cuando se establece myprop , entonces su valor probablemente sea la cadena verdadera / falsa, por lo que para verificar SI se cumple nuestra condición, debemos compararla con la cadena verdadera (o el valor que tenga).

Conclusión : utilizando el exec de Ant combinado con el comando OS, si podemos ejecutar comandos / programas arbitrarios del sistema operativo sin la necesidad de otro objetivo Ant. Usando la misma lógica que la anterior, la declaración similar a IF se puede modificar para que funcione incluso en Windows.


Si desea un tipo de implementación "en caso contrario":

<target name="test.if.tomcat.is.running"> <condition property="tomcat.running" value="true" else="false"> <socket server="${tomcat.host}" port="${tomcat.port}"/> </condition> </target> <target name="my.target.running" if="${tomcat.running}" depends="test.if.tomcat.is.running"> ... </target> <target name="my.target.ifnotrunning" unless="${tomcat.running}" depends="test.if.tomcat.is.running"> ..... </target>


Un objetivo de Ant puede tener una cláusula opcional if o a unless . Esto significa ejecutar la tarea solo si la propiedad está establecida, con una cláusula if , o se desactiva con la cláusula unless 1 . Curiosamente, esa cláusula if o unless se comprueba después de que se ejecuta por primera vez cualquier tarea dependiente.

Esto significa que puede hacer esto en Ant estándar como una forma de ejecutar una tarea Ant solo si se cumple una condición particular:

<target name="test.if.tomcat.is.running"> <condition property="tomcat.running"> <socket server="${tomcat.host}" port="${tomcat.port}"/> </condition> </target> <target name="my.target" if="tomcat.running" depends="test.if.tomcat.is.running"> <yaddah/> <yaddah/> <yaddah/> </target>

Usted especifica que desea que Ant ejecute Target my.target . Ant advierte que my.target depende del objetivo test.if.tomcat.is.running y lo ejecutará primero. La tarea test.if.tomcat.is.running establecerá la propiedad tomcat.running si Tomcat se está ejecutando realmente. De lo contrario, esa propiedad no se establece.

Finalmente, Ant volverá al objetivo my.target y verá si la propiedad tomcat.running está establecida, y solo ejecutará el objetivo my.target si está establecida.

O bien, puede usar las tareas Ant-contrib que pueden hacer que todo su proceso de construcción sea más fácil de entender.

Si quieres ir a la ruta Ant-Contrib, hay una forma fácil de configurar Ant-Contrib, por lo que el tarro Ant-contrib es en realidad parte de tu proyecto. Si alguien revisa su proyecto desde el sistema de control de versiones, también obtendrá el jar de Ant-contrib, y por lo tanto no tendrá que instalar ellos mismos Ant-Contrib.

Descargue el tarro Ant-Contrib y colóquelo en un directorio en la raíz de su proyecto llamado antlib/ac . El antlib se puede utilizar para todo tipo de archivos de tareas opcionales, como Findbugs o PMD. Simplemente coloque cada jar Ant opcional en su propio directorio debajo de antlib (como puse Ant-Contrib en el directorio ac ).

Luego, en su build.xml , especifique las tareas Ant-Contrib de esta manera:

<taskdef resource="net/sf/antcontrib/antlib.xml"> <classpath> <fileset dir="${basedir}/antlib/ac"/> </classpath> </taskdef>

Ahora, puede usar las tareas Ant-Contrib sin preocuparse de si están instaladas en una máquina en particular o no. Verifica su proyecto y tiene acceso a esas tareas automáticamente.

1. Así es, la cláusula if/unless comprueba si una propiedad está establecida y no es true / false que puede causar mucha confusión. He visto a los desarrolladores establecer una propiedad en false o no , y luego me pregunto por qué el objetivo se está ejecutando, ya que la cláusula if se establece en falso.