Laboratorio Prácticas Integración de Sistemas Ant Juan Raposo Santiago Departamento de Tecnoloxías da Información e as Comunicacións Facultade de Informática Universidade da Coruña jrs@udc.es Ant Herramienta del tipo de make (gnumake, nmake ...) Open Source Desarrollada en Java. Otras herramientas existentes. Proyecto Apache Jakarta (http://jakarta.apache.org/ant) Utilizada en otros desarrollos (ej. Tomcat) 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) 19/10/2002 Existe una tarea que permite ejecutar comandos basados en el SO sobre el que se esté utilizando. Utiliza ficheros de configuración XML. Tutorial Ant - Integración de Sistemas 2 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 ... 19/10/2002 Tutorial Ant - Integración de Sistemas 3 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”: 19/10/2002 java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target] Tutorial Ant - Integración de Sistemas 4 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. 19/10/2002 Tutorial Ant - Integración de Sistemas 5 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 <target <target <target name=“A”/> name=“B” depends=“A”/> name=“C” depends=“B”/> name=“D” depends=“C,B,A”/> Si ejecutamos D el orden de ejecución será: A,B,C,D. Un target se ejecuta solamente una vez, aunque varios “dependan” de él. Idea: Target de inicialización (“init”) del que dependan los demás. 19/10/2002 Tutorial Ant - Integración de Sistemas 6 3 Tareas Un target se compone de tareas que se ejecutan secuencialmente cuando se ejecuta el target. <name atribute1=“value1” atribute2=“value2” .../> 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: 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. 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. 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>. 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. 19/10/2002 System.getProperties Adicionalmente define las siguientes propiedades: <property file=”..."/> <property name=”..." value=”..."/> only, ignore, last, first Tutorial Ant - Integración de Sistemas 9 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> <target name="compile" depends="init"> <!-- Compile the java code from ${src} into ${build} --> ç <javac srcdir="${src}" destdir="${build}"/> </target> 19/10/2002 Tutorial Ant - Integración de Sistemas 10 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> 19/10/2002 Tutorial Ant - Integración de Sistemas 11 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. Un cojunto de rutas separadas por “;” o “:” <pathelement location=“...”/> <pathelement path=“...”/> Conjuntos de ficheros definidos en un “FileSet”. <classpath> <pathelement path=“${classpath}”/> <fileset dir=“lib”> <include name”**/*.jar”> </fileset> <pathelement location=“clases”/> </classpath> 19/10/2002 Tutorial Ant - Integración de Sistemas 12 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> 19/10/2002 Tutorial Ant - Integración de Sistemas 13 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 ...> 19/10/2002 Tutorial Ant - Integración de Sistemas 14 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) 19/10/2002 Tutorial Ant - Integración de Sistemas 15 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 **. Por defecto hay una serie de patrones que se excluyen en todas las tareas basadas en directorios: **/*~ **/#*# **/.cvsignore 19/10/2002 **/.#* **/%*% **/CVS **/CVS/** **/SCCS **/SCCS/** **/vssver.scc defaultexcludes=“no” deshabilita estas exclusiones Tutorial Ant - Integración de Sistemas 16 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> como atributos 19/10/2002 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. includes/excludes: lista de patrones separados por comas. includesfile/excludesfile: nombre de fichero con los patrones. Tutorial Ant - Integración de Sistemas 17 FileSet Conjunto de ficheros que encajan con los patrones de una serie de PatternSets. Etiqueta <fileset>. Atributos: 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. 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. 19/10/2002 Tutorial Ant - Integración de Sistemas 18 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. 19/10/2002 Tutorial Ant - Integración de Sistemas 19 Referencias Documentación Ant 19/10/2002 Página Ant: http://jakarta.apache.org/ant Tutorial Ant - Integración de Sistemas 20 10