ATTENZIONE: il nuovo sito di riferimento per questa guida e altre cose più o meno interessanti è il mio BLOG

Indice

Capitolo 10 - Organizzare lo sviluppo con Ant

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.

Un semplice esempio

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.

Eseguire Ant

I target vengono eseguiti passando il loro nome ad ant - ad esempio, per compilare si digita:

	ant compila
che stampa più o meno:
	compila:
	     [echo] Sto compilando le classi in algebra/...
	    [javac] Compiling 5 source files
Ma "compila" è indicato come default target in linea 1, quindi viene eseguito anche in mancanza di argomenti, digitando semplicemente ant.

I task di 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.

Il task 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

Il task 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.



Indice