Diferencia entre revisiones de «Manual básico de ANT»

Contenido eliminado Contenido añadido
m Página reemplazada por «{{destruir| trasladado a wikilibros}}».
Línea 1:
{{destruir| trasladado a wikilibros}}
{{fusionar|Apache Ant}}
{{a wikilibros}}
'''Apache Ant''' es una herramienta usada en programación para la realización de tareas mecánicas y repetitivas, normalmente durante la fase de compilador|compilación y construcción (build). Es similar a Make pero sin las engorrosas dependencias del sistema operativo.
 
Esta herramienta, hecha en [[Lenguaje de programación]] [[Lenguaje de programación Java|Java]], tiene la ventaja de no depender de las órdenes de Intérprete de comandos|shell de cada sistema operativo, sino que se basa en archivos de configuración XML y clases Java para la realización de las distintas tareas, siendo idónea como solución multi-plataforma.
 
==Historia==
ANT fue creado por James Duncan Davidson mientras realizaba la transformación de un proyecto de Sun Microsystems en Open Source (concretamente la implementación de Servlets y JSP de Sun que luego se llamaría Jakarta Tomcat). En un entorno cerrado Make funcionaba correctamente bajo plataforma Solaris, pero para el entorno de open source, donde no era posible determinar la plataforma bajo la que se iba a compilar, era necesaria otra forma de trabajar. Así nació Ant como un simple intérprete que cogía un archivo XML para compilar Tomcat independientemente de la plataforma sobre la que operaba. A partir de este punto la herramienta fue adoptando nuevas funcionalidades y actualmente es un estándar en el mundo Java.
 
 
==¿Qué se necesita para ejecutar ANT?==
 
Para utilizar ANT basta con disponer de una distribución binaria de ANT y tener instalado la versión 1.4 o superior del JDK.
La distribución binaria consiste en la siguiente estructura de directorios:
 
ant
+--- bin // contains launcher scripts
|
+--- lib // contains Ant jars plus necessary dependencies
|
+--- docs // contains documentation
| +--- ant2 // a brief description of ant2 requirements
| |
| +--- images // various logos for html documentation
| |
| +--- manual // Ant documentation (a must read ;-)
|
+--- etc // contains xsl goodies to:
// - create an enhanced report from xml output of various tasks.
// - migrate your build files and get rid of 'deprecated' warning
// - ... and more ;-)
 
solo se necesitan los directorio bin y lib para ejecutar ANT.
 
==Configuración==
 
Una vez obtenida la anterior distribución de ANT, se deben seguir los siguientes pasos:
 
- Añadir el directorio bin al path.
- Asignar a la variable de entorno ANT_HOME la ruta donde se ha instalado ANT.
- Opcionalmente, asignar a la variable de entorno JAVA_HOME la ruta donde se ha instalado el JDK.
 
Dependiendo del sistema operativo en el que nos encontremos tendremos los siguientes ejemplos de configuración:
 
'''Windows and OS/2'''<br>
(Suponiendo que se ha instalado ANT en c:\ant\)
 
set ANT_HOME=c:\ant<br>
set JAVA_HOME=c:\jdk1.2.2<br>
set PATH=%PATH%;%ANT_HOME%\bin<br>
 
 
'''Unix (bash)'''<br>
(Suponiendo que se ha instalado ANT en /usr/local/ant)<br>
 
export ANT_HOME=/usr/local/ant<br>
export JAVA_HOME=/usr/local/jdk-1.2.2<br>
export PATH=${PATH}:${ANT_HOME}/bin<br>
 
 
'''Unix (csh)'''<br>
setenv ANT_HOME /usr/local/ant<br>
setenv JAVA_HOME /usr/local/jdk-1.2.2<br>
set path=( $path $ANT_HOME/bin )
 
 
 
==Estructura de un fichero build.xml==
Los ficheros buildfiles de ANT están escritos en XML.
Cada buildfile contiene un proyecto (project) y al menos un objetivo (target).
Cada objetivo puede contener varias tareas (task) que son fragmentos de código a ejecutar.
Un proyecto, además, puede constar de diversas propiedades. Cada propiedad consta de nombre y valor y son usadas para asignar valores a los atributos de los task.
 
La estructura de un fichero buildfile podría ser la siguiente:
 
buildfile
+--- project // proyecto del buildfile
+
+--- property_1
+--- property_2
+--- target_1 // objetivo_1
| |
| +--- task_1 // tarea 1 de target_1
|
+--- target_2 // objetivo_2
| |
| +--- task_1 // tarea 1 de target_2
| +--- task_2 // tarea 2 de target_2
|
+--- target_3 // objetivo_3
|
+--- task_1 // tarea 1 de target_3
 
==Ejemplo de buildfile==
A continuación se muestra un ejemplo de un archivo build.xml:
 
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="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" description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile" description="generate the distribution" >
<!-- 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" description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
 
 
La primera línea se corresponde con el proyecto que compone el buildfile, en ella pueden aparecer los siguientes atributos:
- name = "MyProject": identifica el nombre del proyecto
- default = "dist": identifica el objetivo que se ejecuta por defecto, en caso de no especificarle uno en concreto.
- basedir = ".": directorio base sobre el que vamos a trabajar. En este ejemplo se trabajaría sobre el directorio actual.
 
A continuación aparecen un listado de propiedades, su declaración se compone del literal property y los atributos name para especificar el nombre y location para asignarles un valor.
 
<property name="src" location="src"/>
 
 
Lo siguiente que aparece en el ejemplo son los objetivos. El primero de ellos es '''init''':
 
<target name="init">
<tstamp/>
<mkdir dir="${build}"/>
</target>
 
Como se mencionó anteriormente, un objetivo esta compuesto por una o varias tareas, en este caso tenemos las tareas '''tstamp''' y '''mkdir''', las cuales muestran la fecha y crean el directorio descrito por la propiedad build respectivamente.
 
El siguiente objetivo que aparece es '''compile'''
 
<target name="compile" depends="init" description="compile the source " >
<javac srcdir="${src}" destdir="${build}"/>
</target>
 
En la declaración del objetivo podemos ver los siguiente atributos:
 
- name = "compile": identifica el nombre del objetivo
- depends = "init": identifica el objetivo que se debe ejecutar antes de lanzarse el actual. En este caso se debe ejecutar previamente el objetivo init (mostrar la fecha del sistema y crear un directorio) antes de ejecutar este objetivo.
- description = "compile the sou": breve descripción de lo que hace el objetivo.
 
El cuerpo del objetivo está formado por la tarea '''javac''', que toma los ficheros fuente ubicados en la ruta indicada por el atributo ''srcdir'' y los compila en ''destdir''.
 
El siguiente objetivo que compone el buildfile es '''dist'''.
 
<target name="dist" depends="compile" description="generate the distribution" >
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
 
En este caso, '''dist''' depende del objetivo '''compile''' para ejecutarse, luego, antes de lanzar sus tareas se debe haber ejecutado '''compile'''.
En este objetivo aparece la tarea '''mkdir''' descrita anteriormente y '''jar''', esta tarea construye un jar con el nombre MyProject concatenado con la fecha del sistema (DSTAMP) a partir de los compilados en el directorio indicado por la propiedad ''build''.
 
 
Por ultimo tenemos el objetivo '''clean'''
 
<target name="clean" description="clean up" >
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
 
Compuesto por 2 tareas '''delete'''. Simplemente borra los directorios temporales necesarios para la creación del jar.
 
 
 
Si repasamos la cabecera del proyecto, vemos que por defecto llama al objetivo '''dist''', el cual depende de '''compile''' y este a su vez de '''init''', por lo que el orden lógico de ejecución de este build.xml es:
Ejecutar objetivo '''init'''
- mostrar fecha de sistema
- crear directorio build<br>
Ejecutar objetivo '''compile'''
- compilar fuentes de src y guardarlos en build<br>
Ejecutar objetivo '''dist'''
- crear directorio lib
- crear jar a partir de los compilados
 
 
El objetivo '''clean''' no depende del resto y tampoco se especifica en la cabecera del proyecto, por lo que se debe referenciar de forma explicita en la línea de comandos para que se ejecute.
 
==Ejecución de ANT==
Para ejecutar ANT basta con escribir '''ant''' en la línea de comandos. Si se ha especificado la ejecución de un objetivo por defecto en la cabecera del proyecto del fichero build.xml no es necesario el uso de ningún parámetro ya que, como acabamos de ver en el ejemplo anterior, se ejecutara este por defecto. Para utilizar un buildfile diferente de build.xml hay que añadir el parámetro -buildfile nombre_fichero, donde nombre_fichero es el buildfile que se quiere utilizar:
 
ant -buildfile buildfile_alt.xml
 
Si se desea ejecutar uno o varios objetivos concretos, se debe añadir el nombre de este o estos objetivos en la línea de comandos vv:
 
ant clean
 
En este caso se ignorara el objetivo indicado en la cabecera del proyecto.
 
==Referencias==
Para ampliar conocimientos en el uso de ANT, podéis consultar el siguiente enlace:
 
http://ant.apache.org/manual/