Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Integración de Sistemas
Ant
Ant
Herramienta del tipo de make (gnumake, nmake ...)
Open Source
Proyecto Apache Jakarta (http://jakarta.apache.org/ant)
Utilizada en otros desarrollos (ej. Tomcat)
Desarrollada en Java.
Otras herramientas existentes.
Shell-based: Ejecutan comandos específicos del sistema
operativo (no reutilizables en diferentes plataformas).
Formatos “estrictos” (ej. tabuladores en Makefiles)
Ant en más portable.
Las tareas son ejecutadas por clases Java. Solo requiere una
MV Java 1.1 o superior (Reutilizable en diferentes plataformas)
Existe una tarea que permite ejecutar comandos basados en el
SO sobre el que se esté utilizando.
Utiliza ficheros de configuración XML.
1
Ejecución
Comando ant
Por defecto busca el fichero build.xml en el directorio actual.
-find busca build.xml en el directorio padre y siguientes
hasta el raíz.
-buildfile filename para indicar otro fichero.
Se pueden especificar uno o más targets a ejecutar.
Por defecto ejecuta el target indicado en el atributo default de
la etiqueta <project>.
Ej: ant -buildfile test.xml compile
Se pueden establecer propiedades que sobreescriban a las
especificadas en el buildfile.
-Dproperty=value
Variables de entorno: ant -DMYVAR=$MYVAR ...
Otras opciones:
-help, -version, -quiet, -verbose, -projecthelp, -listener ...
Ejecución
El script de ant:
En Unix lee y evalua ~/.antrc antes de ejcutar ant.
En Windows invoca %HOME%\antrc_pre.bat al inicio y
%HOME%\antrc_post.bat al final.
Utiliza las siguientes variables de entorno (si fueron
establecidas):
JAVACMD: Para utilizar una JVM diferente a
JAVA_HOME/bin/java
ANT_OPTS: Argumentos pasados a la JVM en línea de
comandos.
Ejecución “manual”:
java -Dant.home=c:\ant org.apache.tools.ant.Main [options]
[target]
2
Buildfiles
Escritos en XML.
Cada fichero contiene un proyecto.
Etiqueta <project>. Atributos:
name: El nombre del proyecto.
default: Target por defecto (Obligatorio)
basedir: Directorio base.
Cada proyecto contiene uno o más targets.
Targets:
Etiqueta <target>. Atributos:
name: Nombre del target (obligatorio).
depends: Lista de targets de los cuales depende.
if / unless: Nombre de una propiedad que debe estar / no estar
establecida para que el target se ejecute.
description: Descripción.
Targets
Es posible establecer dependencias entre targets.
El atributo depends especifica el orden en el que se ejecutan.
No afecta el que un target del que se “depende” no se haya
ejecutado por no ser necesario.
Ant trata de ejecutar los targets de los que se depende en el
orden especificado (izquierda a derecha).
Puede que un target ya se haya ejecutado si uno anterior
depende de él. Ej:
<target name=“A”/>
<target name=“B” depends=“A”/>
<target name=“C” depends=“B”/>
<target name=“D” depends=“C,B,A”/>
3
Tareas
Un target se compone de tareas que se ejecutan
secuencialmente cuando se ejecuta el target.
<name atribute1=“value1” atribute2=“value2” .../>
Los valores de los atributos pueden contener referencias a
propiedades (que se evalúan antes de ejecutar la tarea).
Algunos atributos pueden especificarse como elementos anidados.
Cada tarea está implementada en una clase Java:
Hay un conjunto de tareas incluidas con ant.
Otras tareas están incluidas en un .jar opcional.
Es posible añadir tareas propias.
Todas las tareas comparten tres atributos opcionales:
id: Identificador único.
name: Nombre particular de la instancia (utilizado en los logs).
description: Descripción.
Algunas tareas se ejecutan solo cuando es necesario (por
ejemplo ficheros que no han cambiado no se recompilan).
19/10/2002 Tutorial Ant - Integración de Sistemas 7
Algunas tareas
Ant: Llama a una target de otro buildfile.
Copy: Copia ficheros y directorios.
Delete: Borra ficheros y directorios.
Echo: Envía un mensaje a System.out o a fichero.
GZip: Crea un fichero Gzip.
Javac: Compila código fuente Java.
Javadoc: Genra ficheros HTML javadoc.
Mkdir: Crea un directorio y todos los directorios padre
necesarios.
Property: Permite establecer valores de propiedades.
Tar: Crea un fichero TAR a partir de un conjunto de
ficheros.
19/10/2002 Tutorial Ant - Integración de Sistemas 8
4
Propiedades
Un proyecto puede tener una serie de propiedades.
Establecidas en el buildfile a través de la tarea property.
<property file=”..."/>
<property name=”..." value=”..."/>
Establecidas externamente (-Dproperty=value).
Pueden usarse en los valores de los atributos de las tareas
con el formato ${propertyname}
Ant proporciona acceso a todas las propiedades del sistema
como si se hubiesen definido con <property>.
System.getProperties
Adicionalmente define las siguientes propiedades:
basedir, ant.file, ant.version, ant.project.name, ant.java.version
build.sysclasspath controla como afecta el classpath del
sistema al classpath considerado en Ant.
only, ignore, last, first
Ejemplo
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
5
Ejemplo (cont)
<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the
MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar"
basedir="${build}"/>
</target>
<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Rutas
Se pueden utilizar “/” o “\” y como separadores “:” y “;”
Ant realiza la conversión dependiendo del sistema operativo.
Cuando se necesiten especificar valores de rutas, se pueden
utilizar elementos anidados (nested). Una estructura de rutas
(path-like structure) puede componerse de:
Un único fichero o directorio relativo al directorio base.
<pathelement location=“...”/>
Un cojunto de rutas separadas por “;” o “:”
<pathelement path=“...”/>
Conjuntos de ficheros definidos en un “FileSet”.
<classpath>
<pathelement path=“${classpath}”/>
<fileset dir=“lib”>
<include name”**/*.jar”>
</fileset>
<pathelement location=“clases”/>
</classpath>
6
Rutas
Una estructura de rutas también puede incluir referencias a
otra estructura a través del elemento <path>.
<path id=“base.path”>
<pathelement path=“${classpath}”/>
...
</path>
<path id=“tests.path”>
<path refid=“base.path”>
<pathelement location=”testclasses”/>
</path>
Referencias
Se puede utilizar el atributo id de los elementos de
un buildfile para referirse a ellos:
Útil para no replicar el mismo trozo de XML.
<path id=“project.class.path”>
<pathelement location=“lib”/>
...
</path>
<target ...>
<rmic ...>
<classpath refid=“project.class.path”>
</rmic ...>
</target ...>
<target ...>
<javac ...>
<classpath refid=“project.class.path”>
</javac ...>
</target ...>
7
Tareas basadas en directorios
Algunas tareas actúan sobre árboles de directorios.
Por ejemplo javac actúa sobre los ficheros .java de un árbol.
En muchas ocasiones es útil seleccionar un subconjunto de
ese árbol de directorios.
Formas de crear un subconjunto:
Incluyendo los ficheros/directorios que encajen como mínimo
con un patrón de un conjunto de patrones.
Excluyendo los ficheros/directorios que encajen como mínimo
con un patrón de un conjunto de patrones.
Una combinación de ambos (ficheros/directorios que encajan
con algún patrón de inclusión pero con ninguno de exclusión).
Los patrones pueden definirse:
Dentro del buildfile (mediante atributos de una tarea o
elementos anidados)
Vía ficheros externos (cada línea se interpreta como un patrón)
Patrones
* encaja con 0 o más caracteres
? Encaja con un carácter.
Los emparejamientos se hacen por directorio.
Cuando se utiliza ** como nombre de un directorio en un
patrón encaja con 0 o más niveles de directorios.
/test/** -> Todos los ficheros y directorios bajo /test/
Si un patrón acaba en / o \ entonces se le añade **.
8
PatternSet
Etiqueta <patternset>. Conjuntos de patrones.
Un patternset puede aparecer
anidado dentro de un FileSet o en una tarea basada en
directorios.
al mismo nivel que los targets.
Pueden ser referenciados por su id.
Los patrones que componen un conjunto se definen:
como elementos anidados <include> y <exclude>
name: Patrón (obligatorio).
if: Se usa el patrón si la propiedad nombrada está establecida.
unless: Se usa el patrón si la propiedad nombrada no está
establecida.
como atributos
includes/excludes: lista de patrones separados por comas.
includesfile/excludesfile: nombre de fichero con los patrones.
19/10/2002 Tutorial Ant - Integración de Sistemas 17
FileSet
Conjunto de ficheros que encajan con los patrones de
una serie de PatternSets.
Puede contener elementos anidados <patternset>.
Contienen un PatternSet implícito y soportan los elementos
anidados <includes> <excludes> <includesfile>
<excludesfile> directamente, al igual que los atributos de
PatternSet.
Etiqueta <fileset>. Atributos:
dir: Directorio raíz del conjunto de ficheros
defaultexcludes: Utilización de las exclusiones por defecto.
casesensitive: Sistema de ficheros sensible a mayúsculas /
minúsculas.
includes, excludes, includesfile, excludesfile: idem patternset.
Los FileSet Pueden aparecer dentro de tareas que los
soporten o al mismo nivel que los targets.
9
Ejemplos
<fileset dir="${src}">
<patternset id="non.test.sources">
<include name="std/**/*.java"/>
<include name="prof/**/*.java" if="professional"/>
<exclude name="**/*Test*"/>
</patternset>
</fileset>
Conjunto que contiene a todos los ficheros .java a partir del directorio ${src} que
estén dentro del directorio std o prof (esté último solamente si la propiedad
professional se ha establecido) menos aquellos cuyo nombre contenga “Test”.
<copy todir=“${dist}”>
<fileset dir=“${src}” includes=“**/images/*”
excludes=“**/*.gif”/>
</copy>
Copia todos los ficheros en directorios llamados images situados a partir del
directorio ${src} al directorio ${dist}, menos los que acaben en .gif.
Referencias
Documentación Ant
Página Ant: http://jakarta.apache.org/ant
10