Automatice su proceso de construcción usando Java y Ant

Un proceso definido es una de las herramientas más necesarias pero a menudo menos utilizadas en el desarrollo de software. Es por naturaleza una tarea general que acompaña a un esfuerzo de desarrollo. Un proceso de compilación definido garantiza que el software de su proyecto de desarrollo se compile exactamente de la misma manera cada vez que se ejecuta una compilación. A medida que el proceso de compilación se vuelve más complejo, por ejemplo, con compilaciones de EJB o tareas adicionales, se vuelve más necesario lograr dicha estandarización. Debe establecer, documentar y automatizar la serie exacta de pasos tanto como sea posible.

¿Por qué necesito un proceso de construcción definido?

Un proceso de compilación definido es una parte esencial de cualquier ciclo de desarrollo porque ayuda a cerrar la brecha entre los entornos de desarrollo, integración, prueba y producción. Un proceso de compilación por sí solo acelerará la migración de software de un entorno a otro. También elimina muchos problemas relacionados con la compilación, classpath o propiedades que cuestan tiempo y dinero a muchos proyectos.

¿Qué es Ant?

Ant es una herramienta de scripting independiente de la plataforma que le permite construir sus scripts de compilación de la misma manera que la herramienta "make" en C o C ++. Puede utilizar una gran cantidad de tareas integradas en Ant sin ninguna personalización. Algunas de las tareas más importantes se muestran en la siguiente tabla, pero se explican con más detalle en el ejemplo siguiente.

Aquí hay algunos comandos útiles que están integrados en la distribución Ant.

Mando Descripción
Hormiga Se utiliza para ejecutar otro proceso de hormigas desde el actual.
Copydir Se utiliza para copiar un directorio completo.
Copiar archivo Se utiliza para copiar un solo archivo.
CV Maneja paquetes / módulos recuperados de un repositorio CVS.
Eliminar Elimina un solo archivo o todos los archivos de un directorio específico y sus subdirectorios.
Deltree Elimina un directorio con todos sus archivos y subdirectorios.
Ejecutivo Ejecuta un comando del sistema. Cuando se especifica el atributo os, el comando solo se ejecuta cuando Ant se ejecuta en uno de los sistemas operativos especificados.
Obtener Obtiene un archivo de una URL.
Tarro Frascos de un conjunto de archivos.
Java Ejecuta una clase Java dentro de la VM (Ant) en ejecución o bifurca otra VM si se especifica.
Javac Compila un árbol de origen dentro de la máquina virtual (Ant) en ejecución.
Javadoc / Javadoc2 Genera documentación de código usando la herramienta javadoc.
Mkdir Hace un directorio.
Propiedad Establece una propiedad (por nombre y valor) o un conjunto de propiedades (del archivo o recurso) en el proyecto.
Rmic Ejecuta el compilador rmic para una determinada clase.
Tstamp Establece las propiedades DSTAMP, TSTAMP y TODAY en el proyecto actual.
Estilo Procesa un conjunto de documentos a través de XSLT.

Si bien hay otras herramientas disponibles para realizar compilaciones de software, Ant es fácil de usar y se puede dominar en minutos. Además, Ant le permite crear una funcionalidad ampliada al ampliar algunas de sus clases. Mostraré esta expansión en el siguiente ejemplo.

¿Qué necesito para usar Ant?

Debe instalar tres componentes en su máquina para ejecutar Ant: JDK, analizador XML y Ant (consulte Recursos para obtener enlaces).

En muchos casos, el analizador XML es parte de los archivos lib distribuidos con el servidor Servlet o el servidor web. Si no, el analizador XML gratuito de java.sun.com es suficiente.

La instalación de Ant consiste en descargar los archivos, agregar las bibliotecas de clases a la ruta de clases y agregar los binarios de Ant a la ruta.

Escenario de ejemplo

Este escenario de ejemplo debería ayudarlo a mostrarle el valor de Ant y brindarle información sobre sus beneficios y cómo puede usarlo.

Debido a que una gran parte del desarrollo actual de Java se centra en Java del lado del servidor, he elegido una aplicación del lado del servidor para el ejemplo. Los desarrolladores que trabajan en aplicaciones Java del lado del servidor suelen estar interesados ​​en la compilación de servlets, el despliegue de archivos JSP y el despliegue de archivos HTML, archivos de configuración o imágenes.

Un esquema común para hacer esta compilación implicaría el desarrollo de pequeños scripts en lenguajes específicos de la plataforma basados ​​en el sistema operativo del servidor. Por ejemplo, un desarrollador que trabaja en una máquina NT podría crear un archivo por lotes que realiza las tareas de compilación y luego ejecuta la implementación. Sin embargo, si el entorno de producción tuviera Unix o Linux, el desarrollador tendría que volver a escribir el script, asegurándose de que estuvieran sincronizados.

OK, enséñame cómo funciona esto

Entonces, espero haberlo convencido de la necesidad de usar Ant y mostrar lo simple que es instalarlo. Ahora le mostraré lo simple que es usar Ant con un ejemplo que realiza una compilación e implementación simples.

Proceso de construcción simple con Ant (simple.xml)


  

Hay mucho que explicar en el ejemplo anterior. Primero, debe comprender la estructura del archivo simple.xml. Es un archivo XML bien formateado que contiene una entidad de proyecto que se compone de varias entidades de destino.

La primera línea contiene información sobre el proyecto general que se va a construir.


  

Los elementos más importantes de la línea del proyecto son el defaulty el basedir.

El defaultatributo hace referencia al destino predeterminado que se va a ejecutar. Debido a que Ant es una herramienta de construcción de línea de comandos, es posible ejecutar solo un subconjunto de los pasos de destino en el archivo Ant. Por ejemplo, podría realizar el siguiente comando:

% ant -buildfile simple.xml init 

Eso ejecutará el antcomando y se ejecutará a través del archivo simple.xml hasta que initse alcance el objetivo. Entonces, en este ejemplo, el valor predeterminado es deploy. El proceso Ant invocado en la siguiente línea se ejecutará a través del simple.xmlarchivo hasta que deployse alcance el comando:

% ant -buildfile simple.xml 

El basediratributo se explica por sí mismo, ya que es el directorio base desde el que se recuperan las referencias relativas contenidas en el archivo de construcción. Cada proyecto puede tener solo un basediratributo, por lo que puede elegir incluir la ubicación del directorio completo o dividir el archivo de proyecto grande en archivos de proyecto más pequeños con diferentes basediratributos.

La siguiente línea de interés es la línea objetivo. Aquí se muestran dos versiones diferentes:


  

El targetelemento contiene cuatro atributos: name, if, unless, y depends. Ant requiere el nameatributo, pero los otros tres atributos son opcionales.

Con depends, puede apilar las tareas de Ant para que una tarea dependiente no se inicie hasta que se complete la tarea de la que depende. En el ejemplo anterior, la tarea de limpieza no se iniciará hasta que se inithaya completado. El dependsatributo también puede contener una lista de valores separados por comas que indican varias tareas de las que depende la tarea en discusión.

El ify unlesscomandos le permiten especificar los comandos que se van a llevar a cabo, ya sea si una determinada propiedad se establece o menos que la propiedad se establece. Se ifejecutará cuando se establezca el valor de la propiedad y unlessse ejecutará si no se establece el valor. Puede usar el availablecomando para establecer esas propiedades como se muestra en el siguiente ejemplo, o puede establecerlas a través de la línea de comando.

El initobjetivo del ejemplo simple contiene cuatro líneas de propertycomandos como se muestra aquí:


  

Estas propertylíneas le permiten especificar directorios o archivos de uso común. Una propiedad es un par de nombre-valor simple que le permite hacer referencia al directorio o archivo como una entidad lógica en lugar de física.

Si quería hacer referencia a la sourceDirvariable de más adelante en el archivo Ant, simplemente puede utilizar la siguiente sintaxis para alerta Ant para obtener el valor de esta etiqueta: ${sourceDir}.

Otros dos comandos presentes en el archivo de compilación anterior son:


  

Estos comandos se utilizan para garantizar que no haya archivos extraños en el outputDir(o classesdirectorio cuando se desreferencia como se mencionó anteriormente). El primer comando elimina todo el árbol contenido en outputDir. El segundo comando crea el directorio nuevamente.

La última línea de mayor interés para el desarrollador es la siguiente línea de compilación:


  

El javaccomando requiere un directorio de origen (la ubicación de entrada de los archivos .java) y un directorio de destino (la ubicación de salida del archivo .classes). Es importante tener en cuenta que todos los directorios deben existir antes de la ejecución del antcomando o crearse mediante el mkdircomando. Ant no crea directorios basados ​​en la intuición, por lo que debe crear el outputDir, utilizando el mkdircomando antes del paso de compilación anterior.

Una vez finalizada la compiletarea, la deploytarea realizará la operación de copia para mover todos los archivos JSP del directorio de origen a un directorio de implementación. Al usar el copydircomando, copia todo el directorio JSP de una ubicación a otra. Usé el copyfilecomando para copiar un solo archivo de propiedades como parte de la compilación.

Si bien se necesitaron varias líneas para explicar el ejemplo, debería ser evidente que Ant es una herramienta fácil de usar. Usando este archivo de compilación como punto de partida, debería poder incorporar Ant en su esfuerzo de desarrollo. Los antcomandos que se muestran en el ejemplo anterior tienen más funciones, algunas de las cuales se discutirán en este artículo, el resto se le deja a usted junto con referencias a la documentación.

Tareas importantes

Le queda a usted leer las tareas integradas incluidas en la distribución Ant. Consulte la guía del usuario en Recursos para obtener información sobre cada comando. He elegido dos comandos de uso común como ejemplos de opciones adicionales disponibles para el administrador de compilación sin ninguna personalización.

Código de compilación (incluidos los EJB)

En el ejemplo simple discutido anteriormente, vio una forma simple del javaccomando. Ahora, si lo examina con más detalle, verá que puede especificar los indicadores de compilación, como obsolescencia, depuración u optimización, así como los archivos que se incluirán o no en la compilación.


  

Puede usar las include/excludeentidades dentro de la javactarea para incluir / excluir archivos que coincidan con el patrón en el nameatributo de la compilación. En el ejemplo anterior, desea incluir archivos contenidos en cualquier directorio que termine en .java pero, al mismo tiempo, desea excluir archivos llamados Script.java a menos que una propiedad bsf.presentesté establecida en true.

La bsf.presentpropiedad se establece mediante la siguiente tarea que busca en la ruta de clase el nombre de clase especificado y se establece de bsf.presentacuerdo con los resultados de la búsqueda:


  

El javaccomando no incluirá archivos llamados version.txt de la compilación basada en el comando de exclusión anterior.

Generando javadoc

Otra tarea que Ant puede ayudar a automatizar es la generación de javadoc. Puede utilizar el siguiente comando para generar el javadoc:


  

Los paquetes especifican los paquetes generales que incluirá el javadoc. El sourcepathatributo apunta hacia la ubicación de los archivos de origen. El javadoccomando también proporciona atributos que le permiten especificar el título de la ventana y el documento. También puede incluir un aviso de derechos de autor en la parte inferior de cada página javadoc, utilizando el bottomatributo.

¿Puede Ant hacer XYZ?

En este punto, ha visto algunas de las posibles tareas en su proceso de compilación que Ant puede automatizar. Esas tareas se incluyen de fábrica en Ant. Es posible que desee personalizar Ant para ayudarlo a realizar algunas tareas más difíciles, como crear EJB y realizar la administración de la configuración remota. Algunos de ustedes pueden querer aumentar las capacidades de informes de Ant o construir una interfaz de usuario que pueda ejecutar el proceso Ant.

La respuesta simple a la pregunta "¿Puede Ant hacer XYZ?" es "Sí, pero es posible que deba personalizarlo".

Hormiga extensible

Es interesante discutir dos extensiones de Ant en este punto. Se trata de un aumento de los informes y la capacidad de distribuir código de forma remota utilizando Ant.

Mejoras en los informes