Apache Ant es una herramienta de software para automatizar los procesos de compilación de software para aplicaciones Java [2] que se originó a partir del proyecto Apache Tomcat a principios de 2000 como reemplazo de la herramienta de compilación Make de Unix . [3] Es similar a Make, pero se implementa utilizando el lenguaje Java y requiere la plataforma Java. A diferencia de Make, que utiliza el formato Makefile , Ant utiliza XML para describir el proceso de compilación de código y sus dependencias. [4]
Publicado bajo una licencia Apache por la Apache Software Foundation , Ant es un proyecto de código abierto .
Ant ("Another Neat Tool") [5] fue concebido por James Duncan Davidson mientras preparaba el motor de Servlet y JSP de referencia de Sun Microsystems , más tarde Apache Tomcat , para su lanzamiento como código abierto . Se utilizó una versión propietaria de Make para construirlo en la plataforma Solaris , pero en el mundo del código abierto no había forma de controlar qué plataforma se utilizaba para construir Tomcat; por lo que Ant fue creado como una herramienta simple e independiente de la plataforma para construir Tomcat a partir de directivas en un "archivo de construcción" XML. Ant (versión 1.1) fue lanzado oficialmente como un producto independiente el 19 de julio de 2000.
Se han realizado varias propuestas para una versión 2 de Ant, como AntEater de James Duncan Davidson, Myrmidon de Peter Donald [6] y Mutant de Conor MacNeill, ninguna de las cuales logró una gran aceptación entre la comunidad de desarrolladores. [7]
En un momento (2002), Ant fue la herramienta de compilación utilizada por la mayoría de los proyectos de desarrollo de Java. [8] Por ejemplo, la mayoría de los desarrolladores de Java de código abierto incluyeron build.xml
archivos con su distribución. [ cita requerida ] Debido a que Ant hizo que fuera trivial integrar las pruebas JUnit con el proceso de compilación, Ant permitió a los desarrolladores adoptar el desarrollo basado en pruebas y la programación extrema .
En 2004, Apache creó una nueva herramienta con un propósito similar llamada Maven .
Gradle , que es un software similar, fue creado en 2008, pero utiliza código Groovy (y algunos otros lenguajes) en lugar de XML.
WOProject-Ant [9] es solo uno de los muchos ejemplos de extensiones de tareas escritas para Ant. Estas extensiones se instalan copiando sus .jar
archivos en lib
el directorio de Ant. Una vez hecho esto, estas extensiones de tareas se pueden invocar directamente en el build.xml
archivo típico. Las extensiones WOProject permiten a los desarrolladores de WebObjects utilizar Ant para crear sus marcos y aplicaciones, en lugar de utilizar la suite Xcode de Apple .
Antcontrib
[10] proporciona una colección de tareas tales como declaraciones condicionales y operaciones sobre propiedades, así como otras tareas útiles. [11] [12]
Ant-contrib.unkrig.de
[13] implementa tareas y tipos para redes, interfaces de usuario Swing , procesamiento JSON y otros.
Existen otras extensiones de tareas para Perforce , .NET Framework , EJB y manipulaciones del sistema de archivos. [14]
A continuación se muestra un build.xml
archivo de muestra para una aplicación Java sencilla del tipo "Hola, mundo". Define cuatro objetivos: clean
, [15] y clobber
, cada uno de los cuales tiene una descripción asociada. El objetivo indica el objetivo como una dependencia. Esto le indica a Ant que antes de poder iniciar el objetivo, primero debe completarlo .compile
jar
jar
compile
jar
compile
<?xml version="1.0"?> <project name= "Hello" default= "compilar" > <target name= "limpiar" description= "eliminar archivos intermedios" > <delete dir= "clases" /> </target> <target name= "clobber" dependents= "limpiar" description= "eliminar todos los archivos de artefactos" > <delete file= "hello.jar" /> </target> <target name= "compilar" description= "compilar el código fuente de Java en archivos de clase" > <mkdir dir= "clases" /> <javac srcdir= "." destdir= "classes" /> </target> <target name= "jar" dependent= "compilar" description= "crear un archivo Jar para la aplicación" > <jar destfile= "hello.jar" > <fileset dir= "classes" included= "**/*.class" /> <manifest> <attribute name= "Main-Class" value= "HelloProgram" /> </manifest> </jar> </target> </project>
Dentro de cada objetivo se encuentran las acciones que Ant debe realizar para construir dicho objetivo; estas se realizan mediante tareas integradas. Por ejemplo, para construir el compile
objetivo, Ant primero debe crear un directorio llamado classes
(lo que Ant hará solo si no existe ya) y luego invocar el compilador de Java. Por lo tanto, las tareas utilizadas son mkdir
y javac
. Estas realizan una tarea similar a las utilidades de línea de comandos del mismo nombre.
Otra tarea utilizada en este ejemplo se denomina jar
:
<jar destfile= "hola.jar" >
Esta tarea de Ant tiene el mismo nombre que la utilidad de línea de comandos de Java, JAR, pero en realidad es una llamada al soporte de archivos JAR/ZIP integrado del programa Ant. Este detalle no es relevante para la mayoría de los usuarios finales, que simplemente obtienen el JAR que querían, con los archivos que pidieron.
Muchas tareas de Ant delegan su trabajo a programas externos, ya sean nativos o Java. Utilizan las tareas <exec>
y de Ant <java>
para configurar las líneas de comandos y manejar todos los detalles de la asignación de la información en el archivo de compilación a los argumentos del programa e interpretar el valor de retorno. Los usuarios pueden ver qué tareas hacen esto (por ejemplo <csv>
, <signjar>
, <chmod>
, <rpm>
), al intentar ejecutar la tarea en un sistema sin el programa subyacente en la ruta o sin un Kit de desarrollo de Java (JDK) completo instalado.
Ant está diseñado para funcionar con todos los sistemas para los que hay entornos de ejecución de Java disponibles. Se utiliza con mayor frecuencia con Windows , Linux , macOS y otros sistemas operativos Unix , pero también se ha utilizado en otras plataformas como OS/2, OpenVMS, Solaris y HP-UX. [16]
Ant fue diseñado para ser más portátil que Make. [4] En comparación con Make, Ant utiliza menos comandos de shell específicos de la plataforma . Ant proporciona una funcionalidad integrada que está diseñada para comportarse de la misma manera en todas las plataformas. Por ejemplo, en el build.xml
archivo de ejemplo anterior, el objetivo cleanclasses
elimina el directorio y todo lo que contiene. En un Makefile, esto normalmente se haría con el comando:
rm -rf clases/
rm
es un comando específico de Unix que no está disponible en otros entornos. Microsoft Windows , por ejemplo, utilizaría:
rmdir /S /Q clases
En un archivo de compilación Ant, se lograría el mismo objetivo utilizando un comando integrado:
<eliminar dir= "clases" />
Además, Ant no distingue entre barra diagonal o barra invertida para directorios y punto y coma o dos puntos para separadores de ruta. Convierte cada uno al símbolo apropiado para la plataforma en la que se ejecuta.
<javac>
, <exec>
y <java>
— utilizan valores predeterminados para las opciones que no son coherentes con las versiones más recientes de las tareas. Cambiar esos valores predeterminados podría dañar los scripts Ant existentes.${unassigned.property}
).<for>
bucle Antcontrib, no se puede volver a evaluar una propiedad para un subvalor que puede ser parte de la iteración. (Algunas extensiones de terceros facilitan una solución alternativa; los conjuntos de tareas de control de flujo de AntXtras permiten la redefinición del cursor para los bucles).Existen extensiones de Ant de terceros (llamadas antlibs ) que proporcionan gran parte de la funcionalidad faltante. Además, el entorno de desarrollo integrado (IDE) de Eclipse puede crear y ejecutar scripts de Ant, mientras que el IDE de NetBeans utiliza Ant para su sistema de creación interno. Como ambos IDE son plataformas de desarrollo muy populares, pueden simplificar significativamente el uso de Ant. (Como beneficio adicional, los scripts de Ant generados por NetBeans se pueden utilizar fuera de ese IDE como scripts independientes).