# Apache Ant

Apache Ant és una eina usada en programació per a l'automatització de tasques mecàniques i repetitives, normalment durant la fase de compilació i construcció (build). És similar al make però és escrit en Java i està pensat per usar-lo amb el Java.
La diferència més notable entre Ant i make, és que Ant utilitza un fitxer en format XML per descriure el procés de construcció (build) i les seves dependències. Mentre que el make té el seu propi format Makefile. Per defecte el fitxer XML és anomenat build.xml.
Ant és un projecte de codi obert de l'Apache Software Foundation, distribuït sota la llicència Apache.

## Fitxer d'exemple build.xml

A continuació es mostra un fitxer d'exemple (build.xml) per a una aplicació "Hola món" en Java. El fitxer defineix tres objectius (targets) - clean, compile i jar, cadascun dels quals té una descripció associada. L'objectiu jar llista l'objectiu compile com a dependència. Això li diu a Ant que, abans de començar l'objectiu jar, ha de completar l'objectiu compile.
Dintre de cada objectiu hi han les accions que ha de prendre Ant per a construir l'objectiu. Per exemple, per a construir l'objectiu compile, Ant primer ha de crear un directori anomenat classes (Ant només ho farà si aquest no existeix prèviament) i després cridar al compilador de Java.

## Portabilitat

Un dels primers objectius d'Ant va ser solucionar els problemes de portabilitat de Make. En un Makefile les accions necessàries per a crear un objectiu s'especifiquen com ordres d'intèrpret de comandes que són específics de la plataforma, normalment un shell d'Unix. Ant resol aquest problema proveint una gran quantitat de funcionalitats per ell mateix, que poden garantir que romandran (gairebé) idèntiques en totes les plataformes.
Per exemple, en l'exemple build.xml anterior, l'objectiu (target) clean esborra el directori classes i tot el seu contingut. En un Makefile això normalment es faria amb l'ordre:
rm és una ordre específica de Unix que probablement no estarà disponible si el Makefile s'utilitza en un entorn no Unix com Microsoft Windows. En un fitxer de construcció Ant es pot aconseguir el mateix utilitzant una ordre pròpia:
Una discrepància comuna entre diferents plataformes és la manera que les rutes de directoris s'especifiquen. Unix usa la barra (/) per a delimitar els components d'una ruta, mentre que Windows utilitza la barra invertida (\). Els fitxers de Ant permeten a l'autor triar la seva convenció favorita, barres o barres invertides per a directoris, comas o punt i coma per a separar rutes. Ant ho converteix tot al format apropiat per a la plataforma utilitzada.

## Història

Ant va ser creat per James Duncan Davidson mentre realitzava la transformació d'un projecte de Sun Microsystems en codi obert (concretament la implementació de Servlets i JSP de Sun que després es diria Apache Tomcat). En un entorn tancat Make funcionava correctament sota la plataforma Solaris, però per a l'entorn de codi obert, on no era possible determinar la plataforma sota la qual s'anava a compilar, era necessària una altra forma de treballar. Així va néixer Ant com un simple intèrpret que agafava un arxiu XML per a compilar Tomcat independentment de la plataforma sobre la qual operava. A partir d'aquest punt l'eina va anar adoptant noves funcionalitats i actualment és un estàndard en el món Java.

## Limitacions

* Els fitxers Ant han de ser escrits en XML. Això no és només una barrera per als nous usuaris, sinó també un problema en els projectes molt grans, quan es construïxen fitxers molt grans i complexos. Això potser és un problema comú a tots els llenguatges XML, però la granularitat de les tasques de Ant (comparat amb Maven, per citar-ne algun), significa que els problemes d'escalabilitat arriben aviat.
* La majoria de les antigues eines —les quals s'usen tots els dies, com <javac>, <exec> i <java>— tenen configuracions dolentes per defecte, valors per a opcions que no són coherents amb les tasques més recents. Canviar aquests valors suposa espatllar les eines existents.
* Quan s'expandeixen les propietats en una cadena o un element de text, les propietats no definides no són plantejades com error, sinó que es deixen com una referència sense expandir (ex.: ${unassigned.property}).
* No és un llenguatge per a un flux de treball general, i no hauria de ser utilitzat com a tal. En particular, té regles de control d'errors limitades, i no té persistència d'estat, de manera que no pot ser utilitzat amb confiança per a manejar una construcció de diversos dies.

## Enllaços externs

* Pàgina oficial del projecte Apache Ant (anglès)
* Wiki del projecte Apache Ant Arxivat 2015-12-13 a Wayback Machine. (anglès)