Apache Ant

Ant è un tool per la compilazione di applicazioni Java. Potete pensare ad Ant per Java come all'equivalente di make per i programmi scritti in C/C++.
Grazie ad Ant possiamo automatizzare le operazioni di compilazione, test, pacchetizzazione, distribuzione e deploy dei nostri applicativi.

Installazione (sotto Linux)

Scaricate l'ultima versione di Ant dall'url http://ant.apache.org/

Scompattate il file scaricato e spostate la cartella di Ant ad esempio sotto /opt/ant

impostate le variabili di ambiente necessarie:

export ANT_HOME=/opt/ant
export PATH=$PATH:/$ANT_HOME/bin

(potreste anche inserire queste due righe nel file /etc/profile , in modo che vengano eseguite ad ogni vostro login)

Sotto Windows potete procedere in maniera analoga, magari estraendo Ant nella cartella \Programmi\ant ; le variabili di ambiente vanno invece impostate dal pannello di controllo.

Panoramica

Per utilizzare ant è necessario scrivere un buildfile che tipicamente chiameremo build.xml . Esso ha la seguente struttura:

<project name="nomeProgetto" default="target1">

<description>
    Descrizione progetto
</description>
    
<target name="target1">
    <task1>...</task1>
    <task2>...</task2>
    ...etc...
</target>

<target name="target2">
    <task1>...</task1>
    <task2>...</task2>
    ...etc...
</target>
    
    ...etc...
    
</project>

Come vedete un buildfile è composto da una serie di "target" e di "task". Ogni target è una operazione che si vuole compiere, mentre ogni task è una istruzione da eseguire; quindi tipicamente avremo un target per compilare l'applicativo, uno per creare un file JAR, etc.. e per ogni target daremo istruzioni ad Ant su cosa fare, indicando una sequenza di task.

Un primo esempio

Supponiamo di avere il nostro progetto Java con la seguente struttura:

progetto
  |-- src
  |-- lib
  \-- build.xml

Nella cartella 'src' ci sono i sorgenti, nella cartella 'lib' tutte le librerie di terze parti che utilizziamo (es, Spring, Hibernate, Struts, log4j, altro..) e il nostro buildfile di nome build.xml

Creiamo un buildfile con i seguenti target:

  • build : questo target si occuperà della compilazione del software (i file compilati verranno messi nella cartella 'work')
  • dist : si occupa di creare il pacchetto JAR a partire dei file già compilati
  • clean : cancella tutti i file temporanei
<project name="test" default="build">

<description>
 Progetto di test
</description>
    
<target name="build">
    <mkdir dir="work"/>
    <mkdir dir="work/build"/>
    <javac srcdir="src" destdir="work/build" extdirs="lib"/>
</target>

<target name="dist" depends="build">
    <jar basedir="work/build" destfile="work/applicazione.jar"/>
</target>

<target name="clean">
    <delete dir="work"/>
</target>
    
</project>

Da notare che:

  • alcuni target possono dipendere da altri, ad esempio abbiamo fatto in modo che il target "dist" dipenda dal target "build"; questo vuol dire che quando effettueremo il dist del progetto in automatico ant ne effettuerà prima il build.
  • esiste un target di default, che viene indicato nel tag "project". Quando eseguiamo ant senza specificare il target, questo eseguirà quello di default.

Da linea di comando ci basterà eseguire:

  • ant : in questo modo eseguiremo il target di default effettuando la compilazione del software, questo equivale a scrivere il comando "ant build"
  • ant dist : in questo modo creeremo il file JAR con il nostro applicativo; il file sarà al path work/applicazione.jar
  • ant clean : cancella la cartella work con tutti i file compilati

Un esempio un po' più complesso

Introduciamo nel buildfile precedente l'utilizzo di variabili ("property" nella terminologia ant) e di istruzioni condizionali. Facciamo in modo che sia possibile compilare il nostro software con o senza informazioni di debug, e che sia possible anche indicare la versione di virtual machine che vogliamo usare (1.6 oppure 1,5 etc..). Inoltre modifichiamo il target "build" in modo che, opzionalmente, prima venga effettuato il "clean" (cioè la rimozione dei files temporanei).

Per fare ottenere questo introduciamo tre properties:  debuginfo (default true), vm (default 1.6)

Ecco il nuovo buildfile (ho evidenziato in grassetto le modifiche rispetto al precedente):

<project name="test" default="build">

<description>
 Esempio con IF e PROPERTIES
</description>

<property name="vm" value="1.6"/>
<property name="debuginfo" value="true"/>

<target name="build" depends="clean">
    <mkdir dir="work"/>
    <mkdir dir="work/build"/>
    <javac srcdir="src" destdir="work/build" extdirs="lib" target="${vm}" debug="${debuginfo}"/>
</target>

<target name="dist" depends="build">
    <jar basedir="work/build" destfile="work/applicazione.jar"/>
</target>

<target name="clean" if="clean">
    <delete dir="work"/>
</target>
    
</project>

Dall'esempio si vede come ci si riferisce alle properties, cioè con la sintassi ${nomeProperty}

L'IF presente nel target clean merita una nota più approfondita; if="clean" significa: "esegui il target soltanto è stata definita una property di nome clean". Quindi in pratica "build" dipende da "clean", ma "clean" verrà eseguito soltanto nel caso in cui sia stata definita la propery "clean". Il fatto che ho chiamato il target "clean" con lo stesso nome della property "clean" è solo un caso.

Questo nuovo buildfile lo utilizzeremo in questa maniera:

  • ant  : effettua il build per una virtual machine 1.6 , con le informazioni di debug e senza effettuare prima il clean (impostazioni di default)
  • ant -Dvm=1.5 -Ddebuginfo=false : effettua compila l'applicativo per una virtual machine versione 1.5 e senza informazioni di debug; non effettua il clean
  • ant -Dvm=1.4 -Dclean=true dist : effettua il dist dell'applicativo eseguendo il clean, cioè cancellando prima tutti i files temporanei e compilando per una virtual machine versione 1.4

Alcuni altri task predefini di Ant

Ant prevedere numerosi task predefiniti, e molti altri è possibile installarli come plugin (primi tra tutti segnalo quelli per Tomcat, per la compilazione di file Groovy, e per l'accesso a repository subversion).
Tra quelli predefiniti eccone alcuni

  • echo , scrive a video un messaggio; potete pensarlo come all'equivaltente java di System.out.println("un messaggio")
  • copy , copia uno o più file(s)
  • scp, ftp, get , effettua la copia remota di uno o più file(s)
  • ant , richiama un altro script Ant
  • bzip2, cab, gzip, tar, zip , creazione di archivi compressi in vari formati
  • war, ear, jar , creazione di file di distribuzione Java in vari formati
  • javac , effettua la compilazione dei sorgenti java

per degli esempi di utilizzo consultare il manuale di Ant.

Maggiori informazioni

In questo articolo abbiamo coperto solo una piccola parte delle potenzialità di Ant.
Per maggiori informazioni la migliore fonte è la documentazione ufficiale che trovate all'indirizzo: http://ant.apache.org/manual/

Alternative ad Ant

Esistono diversi altri tool con i quali effettuare la compilazione (e tante altre cose) alternativi ad Ant. Tra questi vi menziono: