Persistencia de Objetos Java: El Camino hacia Hibernate

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP