En esta p�gina reemplazaremos el aburrido fichero build.bat con un bonito y peque�o fichero de construcci�n ant. Necesitar�s instalar ant -- puedes obtenerlo de su p�gina de descarga. Aqu� no cubriremos como instalar ant. Por favor mir� su manual. Despu�s de haber instalado ant, puedes empezar a crear el fichero de construcci�n. Se llamar� build.xml y lo situar�s en el directorio de trabajo en lugar del fichero build.bat (que puedes borrar).
�Un Fichero de Construcci�n B�sico
Un fichero de construcci�n b�sico se parece a �sto:
<project name="hibernate-tutorial" default="compile"> <target name="compile"> </target> </project>
Las etiquetas <project> rodean todo el fichero de construcci�n. Hay dos atributos; name que da nombre al proyecto que se est� construyendo, y default que especifica el objetivo por defecto que se ejecutar� cuando lo lanzemos sin especificar ning�n objetivo.
Dentro de las etiquetas <project>, debemos tener al menos un bloque <target>, donde podemos decirle a ant lo que tiene que hacer -- en este caso no hara nada. Podemos ejecutar el el fichero de construcci�n utiliando ant en la l�nea de comandos desde el directorio de trabajo.
Deber�as obtener una salida como �sta:
Buildfile: build.xml compile: BUILD SUCCESSFUL Total time: 1 second
Este nos dice que ant se ejecut� con �xito y qu� fichero de construcci�n se utiliz�. Se ejecut� el objetivo por defecto, que es por lo que la salida muestra compile:. Sin embargo podemos hacer que ant ejecute un objetivo expl�cito lamandolo con ant compile desde la l�nea de comandos, que ejecutar� el objetivo compile.
Ahora queremos que ant realmente complie nuestras clases. Por eso insertamos la tarea <javac> dentro de los elementos <target>:
<project name="hibernate-tutorial" default="compile"> <target name="compile"> <javac srcdir="./src" destdir="./bin" debug="on" /> </target> </project>
Esto le dir� a ant que lance el compilador javac y compile todo lo que pueda encontrar bajo el directorio src y sit�e los ficheros class generados en el directorio bin. Sin embargo si ejecutamos ant ahora, obtendremos un mont�n de errores de compilaci�n, porque el compilador no puede encontrar las clases de Hibernate. Tenemos que decirle al compilador qu� classpath utilizar, como lo hicimos en build.bat:
<project name="hibernate-tutorial" default="compile"> <target name="compile"> <javac srcdir="./src" destdir="./bin" debug="on" > <classpath> <fileset dir="./lib"> <include name="*.jar"/> </fileset> </classpath> </javac> </target> </project>
Esto le dir� a ant que encuentre todos los ficheros que terminen en ".jar" que haya en el directorio lib y los a�ada al classpath usado para la compilaci�n. Si ejecutamos ahora ant, deber�amos ver una salida como �sta:
C:\hibernateTutorial\part2>ant Buildfile: build.xml compile: [javac] Compiling 2 source files to C:\hibernateTutorial\part2\bin BUILD SUCCESSFUL Total time: 1 second
�Objetivos Dependientes
Perfecto, ya hemos conseguido que ant compile nuestros ficheros Java. Sin embargo todav�a tenemos que copiar el fichero log4j.properties y el fichero de mapeo al directorio bin. Haremos esto utilizando un objetivo adicional:
<project name="hibernate-tutorial" default="compile"> <target name="compile"> <javac srcdir="./src" destdir="./bin" debug="on" > <classpath> <fileset dir="./lib"> <include name="*.jar"/> </fileset> </classpath> </javac> </target> <target name="copy-resources"> <copy todir="./bin"> <fileset dir="./src"> <exclude name="**/*.java"/> </fileset> </copy> </target> </project>
Esto le dice a ant que ejecute el objetivo copy-resources para copiar todo lo que pueda encontrar en el directorio src o en cualqueir directorio bajo �l al directorio bin, pero excluyendo cualquier fichero Java que pueda haber en cualquier lugar bajo el directorio src (esto es lo que significan los ** delante de la /).
Si ejecutas ant ahora, ver�s ... realmente nada. Ant ejecutar� el objetivo compile y no tocar� el objetivo copy-resources. Por eso, lo que necesitamos hacer ahora es decirle a ant que ejecute copy-resources antes del objetivo compile - esto es lo que hace el atributo depents del elemento target:
<project name="hibernate-tutorial" default="compile"> <target name="compile" depends="copy-resources"> <javac srcdir="./src" destdir="./bin" debug="on" > <classpath> <fileset dir="./lib"> <include name="*.jar"/> </fileset> </classpath> </javac> </target> <target name="copy-resources"> <copy todir="./bin"> <fileset dir="./src"> <exclude name="**/*.java"/> </fileset> </copy> </target> </project>
Si lo ejecutas ahora, ant deber�a mostrar una salida como �sta:
Buildfile: build.xml copy-resources: [copy] Copying 3 files to C:\hibernateTutorial\part2\bin compile: BUILD SUCCESSFUL Total time: 0 seconds
Ahora ant ha ejecutado los dos objetivos y ha copiado los recursos al directorio bin. Observar�s que ant no imprime nada sobre el objetivo compile. Ant ha observado que no se ha modificado ning�n fichero fuente y no los compila de nuevo. Lo mismo suceder� con copy-resources - ant no copiar� de nuevo los ficheros a menos que hayan cambiado, o que los hayamos eliminado del directorio bin.
�Utilizar Propiedades
Ahora ya tenemos un bonito fichero de contrucci�n en un lugar. Pero no podr�amos sacarlo de aqu�. Sin embargo habr�s observado que nuestros nombres de directorios se han esparcido por todo el fichero. Si alguna vez tuvieramos que cambiarlos, deber�amos hacerlo por todo el fichero de construcci�n. Resolveremos este problema utilizando declaraciones de propiedades ant:
<project name="hibernate-tutorial" default="compile"> <property name="sourcedir" value="${basedir}/src"/> <property name="targetdir" value="${basedir}/bin"/> <property name="librarydir" value="${basedir}/lib"/> <target name="compile" depends="copy-resources"> <javac srcdir="${sourcedir}" destdir="${targetdir}" debug="on" > <classpath> <fileset dir="${librarydir}"> <include name="*.jar"/> </fileset> </classpath> </javac> </target> <target name="copy-resources"> <copy todir="${targetdir}"> <fileset dir="${sourcedir}"> <exclude name="**/*.java"/> </fileset> </copy> </target> </project>
Podemos definir nuestras propiedades utilizando la etiqueta property, y podemos insertarlas en cualquier lugar del fichero utilizando el mismo nombre que declaramos para la propiedad pero rode�ndolo con ${}.
Observa la propiedad ${basedir} que utilizamos en las declaraciones de propiedades -- esta es una propiedad definida por ant, que contiene el path del directorio desde el que se ha ejecutado ant.