# Apache Ant

Apache Ant es una herramienta usada en programación para la realización de tareas mecánicas y repetitivas, normalmente durante la fase de compilación y construcción (build). Es, por tanto, un software para procesos de automatización de compilación, similar a Make pero desarrollado en lenguaje Java y requiere la plataforma Java, así que es más apropiado para la construcción de proyectos Java.
Esta herramienta, hecha en el lenguaje de programación Java, tiene la ventaja de no depender de las órdenes del 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.
La diferencia más notable entre Ant y Make es que Ant utiliza XML para describir el proceso de generación y sus dependencias, mientras que Make utiliza formato makefile. Por defecto, el archivo XML se denomina build.xml.
Ant es un proyecto de la Apache Software Foundation. Es software open source, y se lanza bajo la licencia Apache Software.

## Historia

ANT (siglas de "Another Neat Tool", en español "Otra Ingeniosa Herramienta", que en inglés significan "hormiga") fue creado por James Duncan Davidson mientras realizaba la transformación del proyecto Solar de Sun Microsystems en código abierto (concretamente la implementación del motor JSP/Servlet de Sun, que luego se llamaría Jakarta Tomcat). Se usó una versión de código propietario de make para construirlo en entorno Solaris Operating Environment. En un entorno cerrado Make funcionaba correctamente bajo plataforma Solaris, pero para el entorno de código abierto, donde no era posible determinar la plataforma bajo la que se iba a compilar Tomcat, era necesaria otra forma de trabajar. Así nació Ant como un simple intérprete que cogía un archivo XML "build file" para compilar Tomcat independientemente de la plataforma sobre la que operaba. ANT (versión 1.1) fue lanzado oficialmente como un producto independiente el 19 de julio de 2000. A partir de este punto la herramienta fue adoptando nuevas funcionalidades y actualmente es un estándar en el mundo Java.
Se han hecho varias propuestas para una versión Ant 2, como AntEater (oso hormiguero) por James Duncan Davidson, Myrmidon por Peter Donald y Mutant (mutante) por Conor MacNeill, ninguno de los cuales fueron capaces de encontrar gran aceptación en la comunidad de desarrolladores.

## Uso

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: La carpeta "ant" contiene las carpetas "bin" (que asimismo contiene scripts de lanzador), "lib" (que contiene las dependencias necesarias y los .JAR de Ant), "docs", (que contiene la documentación de Ant, incluyendo una descripción, imágenes y un manual), y "etc" (que contiene valiosos archivos .XSL para crear informe de mejora de la salida XML de varias tareas, migrar los archivos de creación y deshacerse de la "obsoleta" alerta, y más). Pero solo se necesitan los directorios bin y lib para ejecutar ANT.

## 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, se ejecutará 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:
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:
En este caso se ignorara el objetivo indicado en la cabecera del proyecto.

## Características

Hoy en día, ANT es la herramienta de construcción de software (compilación) utilizada por la mayoría de los proyectos de desarrollo de Java. Por ejemplo, la mayoría de desarrolladores de código abierto incluye archivos build.xml en sus distribuciones. Debido a que ANT ha hecho trivial el integrar pruebas JUnit con el proceso de generación (compilación), ANT ha hecho fácil para los desarrolladores adoptar el desarrollo basado en pruebas, e incluso extreme programming.

## Limitaciones

* Al ser una herramienta basada en XML, los archivos Ant deben ser escritos en XML. Esto es no sólo una barrera para los nuevos usuarios, sino también un problema en los proyectos muy grandes, cuando se construyen archivos muy grandes y complejos. Esto quizá sea un problema común a todos los lenguajes XML, pero la granularidad de las tareas de Ant (comparado con Maven, por decir alguno), significa que los problemas de escalabilidad llegan pronto.
* La mayoría de las antiguas herramientas — las que se usan todos los días, como <javac>, <exec> y <java> — tienen malas configuraciones por defecto, valores para opciones que no son coherentes con las tareas más recientes. Esta es la maldición de la compatibilidad hacia atrás: cambiar estos valores supone estropear las herramientas existentes.
* Cuando se expanden las propiedades en una cadena o un elemento de texto, las propiedades no definidas no son planteadas como error, sino que se dejan como una referencia sin expandir (ej.: ${unassigned.property}). De nuevo, esta es una cuestión de la compatibilidad hacia atrás, incluso se reconoce que tener la herramienta desactivada es normalmente la mejor opción, al menos hasta el punto que el mítico producto "Ant2.0" falle en propiedades no asignadas.
* No es un lenguaje para un flujo de trabajo general, y no debería ser usado como tal. En particular, tiene reglas de manejo de errores limitadas, y no tiene persistencia de estado, así que no puede ser usado con confianza para manejar una construcción de varios días.

## 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.

## Extensiones

WOProject-Ant es uno de los muchos ejemplos de una tarea de extensión escrita para ANT. Estas extensiones son puestas en uso copiando los archivos jar en el directorio lib. Una vez hecho esto, estas tareas de extensión pueden ser invocadas directamente en el típico archivo build.xml. Las extensiones de WOProject WebObjects permiten a los desarrolladores el uso de ANT en la construcción de sus marcos y aplicaciones, en lugar de la suite Apple Xcode.
Antcontrib proporciona un conjunto de tareas tales como sentencias condicionales y operaciones sobre las propiedades, así como otras tareas útiles.
Existen otras extensiones de tareas para Perforce, .NET, EJB, y manipulaciones del sistema de archivos, por nombrar algunos.

## Portabilidad

Una de las primeras ayudas de Ant fue solucionar los problemas de portabilidad de Make. En un Makefile las acciones necesarias para crear un objetivo se especifican como órdenes de Intérprete de comandos que son específicos de la plataforma, normalmente un shell de Unix. Ant resuelve este problema proveyendo una gran cantidad de funcionalidades por él mismo, que pueden garantizar que permanecerán (casi) idénticas en todas las plataformas.