ATTENZIONE: il nuovo sito di riferimento per questa guida e altre cose più
o meno interessanti è
il mio BLOG
In conclusione di questa guida presenterò Ant, uno strumento che permette di automatizzare vari task, come la compilazione di sorgenti java, l'esecuzione di programmi, la generazione della documentazione javadoc, varie operazioni su file e directory e molto altro. Ant è di fatto lo standard per gestire progetti software in java - viene adottato anche da applicazioni quali Eclipse e Netbeans - ed è praticamente indispensabile per progetti medio-grandi.
Ant esegue i task indicati in un buildfile, un file analogo ai
makefile di make
scritto in xml.
Segue un esempio di buildfile, di default chiamato build.xml
:
<project name="algebra" default="compila" basedir="."> <!-- compilazione classi in algebra/... --> <target name="compila"> 5 <echo message="Sto compilando le classi in algebra/..."/> <javac srcdir="algebra"/> </target> <!-- cancellazione file .class in algebra/... --> 10 <target name="clean"> <echo message="Sto cancellando i file .class in algebra/..."/> <delete> <fileset dir="algebra" includes="**/*.class"/> </delete> 15 </target> </project>Deve essere presente un elemento
project
, che racchiude uno o
più target - in questo caso due, uno per compilare
le classi presenti nella directory algebra/
, linee 4-7, e uno
per "fare pulizia", che cancella i file compilati dalla stessa directory,
linee 10-15. Le linee 3 e 9 sono commenti.
I target vengono eseguiti passando il loro nome ad ant - ad esempio, per compilare si digita:
ant compilache stampa più o meno:
compila: [echo] Sto compilando le classi in algebra/... [javac] Compiling 5 source filesMa "compila" è indicato come default target in linea 1, quindi viene eseguito anche in mancanza di argomenti, digitando semplicemente
ant
.
I target agiscono usando i task messi a disposizione da Ant.
Nel file di esempio ho usato i task echo
, javac
e delete
, con significati ovvi.
Ci sono molti altri task - è anche possibile crearne di nuovi -
tutti documentati nella sezione "Ant Tasks" del manuale di Ant,
reperibile nel sito o nella distribuzione.
junit
Un task molto utile è junit
, che esegue delle classi di
test. Aggiungiamo al file build.xml
un altro target denominato "test",
dipendente dal target "compila":
<target name="test" depends="compila"> <junit printsummary="on" haltonfailure="yes"> <classpath refid="test.class.path"/> 5 <batchtest fork="yes"> <fileset dir="test" includes="**/*.class"/> </batchtest> </junit> 10 </target>digitando
ant test
vengono eseguiti prima "compila" e poi "test".
In linea 4 si vede come si usa un riferimento - prima, ad esempio a partire dalla linea 2 del file di esempio, definisco una proprietà, che decido di chiamare "junit.path", e la inizializzo con il path dell'archivio di JUnit:
<!-- junit location --> <property name="junit.path" location="/opt/junit4.0/junit-4.0.jar"/>poi uso questa proprietà in un elemento di un path che chiamo - tramite l'attributo
id
- "test.class.path":
<path id="test.class.path"> <pathelement path="${junit.path}"/> <pathelement location="test"/> <pathelement location="."/> </path>a questo punto posso fare riferimento al path suddetto all'interno dell'elemento
classpath
con refid
:
<classpath refid="test.class.path"/>È opportuno anche aggiungere un task
javac
al target
"compila", per compilare le classi di test, e un task delete
al target "clean":
<echo message="Sto compilando le classi di test..."/> <javac srcdir="test"> <classpath refid="test.class.path"/> </javac> ... <echo message="Sto cancellando i file .class in test/..."/> <delete> <fileset dir="test" includes="**/*.class"/> </delete>Anche in questo caso posso usare il path definito in precedenza.
Nota: una proprietà si può ridefinire da linea di comando passandola
ad Ant tramite l'opzione -D
, ad esempio:
ant test -Djunit.path=/usr/lib/junit4.0/junit-4.0.jar
jar
Infine esiste un task per produrre un pacchetto jar - in questo caso lo dichiariamo dipendente da "test", in modo da evitare che un'applicazione che non passa i test sia distribuita:
<target name="jar" depends="test"> <echo message="Sto impacchettando l'applicazione..."/> <jar destfile="algebra.jar" basedir="."> 5 <include name="algebra/*.class"/> <manifest> <attribute name="Main-Class" value="algebra.Prova"/> </manifest> 10 </jar> </target>Da notare alle linee 7-9 la possibilità di specificare un file manifesto in linea, senza prima crearlo.