Elementos y Selectores de Tareas de Ant

Ya hemos hablado en post anteriores tanto de los Bloques como de las Tareas de Ant. Sin embargo, aún nos quedaría tratar un tercer nivel de ejecución de la herramienta Ant. Nos estamos refiriendo a las estructuras denominadas Elementos. Tal y como ya vimos en su momento, la configuración de Ant está dividida en una serie de Bloques de ejecución, cada uno de los cuales podrá estar compuesto por una serie de Tareas de ejecución (denominadas Task). Esta atomización es la que permite la famosa flexibilidad del plugin de Ant.

 


Pues bien, yendo un poco más allá, hay que especificar que, dentro de cada Tarea, nos vamos a encontrar una serie de tags denominados Elementos. Cada uno de estos elementos nos servirá para ir definiendo y especificando la funcionalidad que deberá ser realizada dentro de una Task determinada. Dicho de otro modo, podemos visualizar los elementos como una serie de parametrizaciones que deben ser establecidas de una forma u otra para que la Task ejecute con precisión el proceso requerido por nuestra aplicación.


Elementos de ejecución de Tareas de Ant


Teniendo en cuenta lo anterior, a nadie le sorprenderá si digo que dentro de cada una de las task de Ant podemos ir definiendo una serie de elementos que nos permitirán ejecutar la tarea tal y como queremos que se haga. Obviamente, podremos encontrarnos más de un elemento dentro de la misma tarea.


👉 Por ejemplo, en la siguiente tarea podemos observar un elemento denominado <fileset>

 
<target name="compile" description="Compiles the code" depends="prepare">
    ...
    <fileset dir="build" defaultexcludes="yes">
            <include name="**/*.java" />
            <exclude name="**/*Test*" />
    </fileset>
    ...
</target>
 


Patrones de Ant

 

Antes de continuar, me gustaría detallar un tipo especial de elemento. Me refiero a la definición de patrones que nos vamos a encontrar continuamente en las tareas de Ant.

Los patrones de Ant son la forma en que podemos indicarle al plugin si queremos que una tarea trate al mismo tiempo varios objetos que tengan parte de su denominación en común.

 

Los patrones más comunes son los siguientes:

 

* Para incluir todos los subdirectorios recursivamente, se usará el patrón

**

* Para incluir el comodín de una cadena completa se incluirá el patrón

*

* Para incluir el comodín de un único caracter se incluirá el patrón

?

 

Para especificar un determinado patrón en una task, tendremos que usar el elemento “patternset”. 

<patternset>

 

Esto se podrá hacer de dos modos.

* Modo 1

<patternset id="classes" includes name="**/*.class" excludes name="**/*Test*.class" />

* Modo 2

<patternset id="classes" >
    <include name="**/*.class" />
    <exclude name="**/*Test*.class" />
</patternset>

 

Elementos básicos de Tareas de Ant

 

A continuación, voy a presentar la lista de los elementos más comunes que nos vamos a encontrar en Ant (según mi experiencia, claro está).

 

* Fileset: Para indicar que se va a trabajar con un determinado fichero. Se utiliza la etiqueta 

<fileset>


👉 Ejemplo:

 
<fileset dir="build1" defaultexcludes="yes">
    <patternset id="classes" >
        <include name="**/*.java" />
        <exclude name="**/*Test*" />
    </patternset>
</fileset>

<fileset dir="build2" defaultexcludes="yes">
        <include name="**/*.java" />
        <exclude name="**/*Test*" />
</fileset>

<fileset dir="build3" defaultexcludes="yes" includes="**/*.java" excludes="**/*Test*" />


* Filelist: Para incluir una lista de ficheros. Se utiliza el tag:

<filelist>


👉 Ejemplo:


<filelist id="" dir="..." files="file1.java, file2.java" />

 

* Mapper: Permite establecer un mapeo para la acción a realizar. Se utiliza la etiqueta

<mapper>

 

👉 Ejemplo: filtrar determinados ficheros en una task de copia

 
<copy todir="...">
    <mapper type="merge" to="mge" />
    <fileset dir="src">
        <include name="**/*.java" />
    </fileset>
</copy>
 


👉 Ejemplo: crear fichero XML destino

 
<mapper type="package" from="*Test.java" to="TEST-*Test.xml" />
 


* Classfileset: Permite definir una referencia a un fichero. Este comando necesita que Ant tenga acceso a la librería BCEL. Se utiliza la etiqueta

<classfileset>


👉 Ejemplo:


<classfileset id="reqClasses" dir="${classes.dir}" />
    <rootfileset dir="${classes.dir}" includes="com/pluralsight/tools/Util*.class" />
</classfileset>


* Path: Sirve para definir una ruta de acceso a determinados directorios y ficheros. Se utiliza la etiqueta

<path>


👉 Ejemplo:


<path id="classpath" >
    <pathelement path="{$servlet.dir}/servlet.jar" />
    <pathelement path="{$javamail.dir}/mail.jar" />
    <fileset dir="{$lib.dir}">
        <include name="**/*.jar" />
    </fileset>
</path>

Posteriormente, en cualquier task podremos acceder a la ruta anterior usando el identificador de la ruta.

 
<path refid="classpath" />
 


* Filter Readers: Sirven para eliminar comentarios de determinados ficheros. Dentro de esta tipología podemos encontrar los siguientes tags:

<stripjavacomments>

<striplinecomments>

<striplinebreaks>


👉 Ejemplo: Eliminar comentarios de los ficheros java dentro de una determinada task

 
<stripjavacomments />
 

 

👉 Ejemplo: Eliminar comentarios que empiecen por la cadena “--”

 
<striplinecomment>
    <comment value="--">
</striplinecomments>
 

 

👉 Ejemplo: Eliminar saltos de línea

 
<striplinebreaks />
 



Selectores básicos de Tareas de Ant

 

Los selectores son una tipología especial de elementos que nos permiten seleccionar objetos en función de diferentes características de los mismos. Al igual que el resto de los elementos de Ant, los selectores deben ser incluidos dentro de una task concreta.

La lista de selectores más comunes sería la siguiente:


* Date: Selección por fecha.

<date>

 

👉 Ejemplo:

 
<date datetime="03/03/2023 12:00 AM" when="after" />
 


* Present: selección en función de la existencia (“presencia”) de los ficheros en el directorio origen o en el directorio destino.

<present>

 

👉 Ejemplo:

 
<present present="srconly" targetdir="${v1.src.dir}" /> 
 


* Size: selección por tamaño.

<size>


👉 Ejemplo: seleccionar ficheros menores de 1 Kbyte

 
<size value="1" units="Ki" when="less" />
 

 

* Contains: selección de ficheros que contengan un determinado patrón de texto.

<contains>


👉 Ejemplo

 
<contains text="TODO" casesensitive="no" /> 
 

 

* Containsregexp: selección de ficheros que contienen un determinado patrón de tipo Regexp (esto es, patrones definidos mediante “regular expression”).

<containsregexp>

 

👉 Ejemplo:

 
<containsregexp expression="[4-6]\.[0-9]" />
 

 

 

* Type: Selección en función del tipo de fichero.

<type>

 

👉 Ejemplo:

 
<type />
 

 

* Selectores lógicos: Están definidos por los siguientes tags:

<and>

<or>

<not>

<none>

 

👉 Ejemplo: Selector lógico AND para añadir una condición adicional dentro de una task

 
<and>
    <size value="4" units="Ki" when="more" />
</and>


Alerts y Loggers de Ant

 

Junto a los elementos y selectores mencionados, en Ant adicionalmente podremos utilizar una serie de Alerts y Loggers que nos permitirán ir recogiendo información asociada a la ejecución de las diferentes tareas del XML.

 

Aunque no vamos a entrar en detalle sobre este tema, sí que mencionaré que los tipos principales de Loggers con los que podemos trabajar son los siguientes.

  • DefaultLogger
  • NoBannerLogger
  • TimestampedLogger
  • BigProjectLogger
  • SimpleBigProjectLogger
  • ProfileLogger
  • AnsiColorLogger
  • MailLogger
  • Log4JListener

 

En líneas generales, con todos los apartados mencionados en este post ya nos debería bastar para tener una visión global básica de cuáles son las tipologías de elementos y selectores que vamos a necesitar para realizar la construcción de nuestra aplicación mediante Ant. De hecho, salvo que tu proyecto sea de alta complejidad, lo más probable es que no necesites buscar elementos adicionales a los mencionados en este artículo. Dicho de otro modo, con estos elementos deberíamos tener suficiente para elaborar el .xml requerido para aplicaciones de complejidad media/baja.

 

Pues nada, eso es todo lo que quería comentarte en relación con los elementos y selectores que nos podemos encontrar en las Task de Ant. A partir de aquí, no deberías tener problema en profundizar en la herramienta si en algún momento tu proyecto lo requiere. En cualquier caso, puedes dejarme aquí abajo cualquier pregunta que te surja al respecto.

Saludos.


Comentarios

Entradas populares de este blog

Configurar Apache Tomcat en Eclipse

Creación de Webservice SOAP básico

Componentes y Ventanas de Java Swing