Sei sulla pagina 1di 8

JJ n.

2 gennaio-febbraio 2007

Apache Ant
di Michele Ferretti
` Il progetto Apache mette a disposizione una notevole quantita di software open source, in particolare possiamo trovare parecchie librerie e soft` ware utili (e forse indispensabili) allo sviluppo Java. Uno dei piu importanti ` software di Apache e Ant, la formichina software che lavora per voi

Michele Ferretti ` E un giovane programmatore che si occupa di sviluppo Java per lavoro e nel tempo libero si diletta con Python ed con il mondo Ruby e Ruby On Rails

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of Java Journal, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2007 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2007 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Java Journal sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2007 Infomedia e rila` sciato con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2007 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

JAVA Journal

educational

Apache Ant
Il progetto Apache mette a disposizione una notevole quantit di software open source, in particolare possiamo trovare parecchie librerie e software utili (e forse indispensabili) allo sviluppo Java. Uno dei pi importanti software di Apache Ant, la formichina software che lavora per voi
>> di Michele Ferretti (michele.ferretti@javajournal.it)

A
Make

nt si basa sui concetti di uno strumento di sviluppo molto vecchio: Make. Make , ed stato per anni, uno strumento fondamentale per gli sviluppatori software. Make esegue una sequenza di operazioni per ottenere un risultato finale, che di solito il pacchetto software da distribuire. Ant fa lo stesso, ma con maggiore eleganza e con un framework a plug-in, che permette di aggiungere funzionalit codificandole in classi Java.

Per capire a fondo cosa e cosa fa Apache Ant, bisogna capire quali sono le esigenze che hanno portato gli sviluppatori a crearsi strumenti per velocizzare operazioni ridondanti e noiose. Make un software che processa dei file di testo denominati Makefile. I Makefile sono file che contengono direttive raggruppate per target. I target sono dei gruppi di comandi che permettono di compilare i sorgenti, creare archivi dei binari, ecc. Make nato per essere utilizzato in ambiente C ma con il tempo stato utilizzato per parecchi altri compiti. La filosofia di Ant Quando James Duncan Davidson cominci a sviluppare Tomcat si trov di fronte un sacco di sorgenti e parecchie operazioni da eseguire per compilarli. Decise quindi che era arrivato il momento di creare un nuovo strumento di sviluppo. Ant nacque proprio da questa esigenza: poter eseguire una serie di operazioni indipendentemente dal sistema operativo. Java, per definizione, multipiattaforma e quindi richiede un tool e un formato portabile per la compilazione delle applicazioni. Ovviamente il linguaggio pi adatto per creare lo strumento Java stesso, e il formato portabile per

eccellenza XML. A mio parere, luso del formato XML la vera forza di questo progetto. La sintassi di XML universalmente condivisa e semplice da apprendere. Nei vecchi Makefile la sintassi era particolarmente complessa. Ovunque c una virtual machine Java c la possibilit di utilizzare Ant. Make invece pi difficile da installare proprio per la sua natura C. Make a tutti gli effetti uno standard in tutti i sistemi operativi della famiglia Unix, comprese le centinaia di distribuzioni Linux. Utilizzare Make su Windows un dramma perch siamo costretti a crearci un ambiente particolare per eseguirlo. Ant molto pi semplice, pi flessibile e portabile. Per compilare un software Java su Linux, Mac OSX o Windows si utilizza sempre lo stesso file XML. In Ant il nome predefinito per un file di build build.xml. Se si lancia il comando ant in una directory, il programma cerca un file chiamato build.xml e lo processa. Se non viene specificato il target, Ant esegue quello che viene dichiarato come predefinito allinterno del progetto. Il formato dei file build.xml Come gi accennato il formato dei file di build XML e la sua struttura pu essere riassunta in breve con questo esempio:
<project name=ProjectName default=dist basedir=.> <target name=dist> <!Lista di task --> </target> </project>

Il tag project il contenitore generale di un file build.xml e al suo interno racchiude diversi blocchi target. Ogni target al suo interno pu contenere

n.2 - gennaio/febbraio 2007

31

educational

JAVA Journal
Esegue un altro build file. Chiama lesecuzione di un altro target. Comprime un file con lalgoritmo Bzip o Bzip2. Cambia i permessi di un file in sistemi Unix. Copia una file o una lista di file. Copia una directoty. Esegue una serie dicomandi su CVS. Elimina un file o una directory ricorsivamente. Stampa a video un messaggio. Esegue un comando di sistema o un programma esterno. Importa un altro build file in quello corrente. Permette literazione con lutente durante la fase di build. Crea un archivio Jar. Esegue codice Java. Compila sorgenti Java. Invia messaggi di posta elettronica. Crea una directory. Sposta un file. Crea un archivio Tar. Decomprime un archivio Zip. Processa uno o pi file XSLT. Crea un archio Zip.

Ant AntCall Gzip Chmod Copy Copydir Cvs Delete Echo Exec Import Input Jar Java Javac Mail Mkdir Move Tar Unzip Xslt Zip

TABELLA 1 Una lista dei pi importanti task diversi tag chiamati task. Project richiede un attributo name dove viene specificato il nome del progetto, un attributo default che contiene il nome del target che deve essere considerato predefinito, e lattributo basedir che contiene la directory corrente quando si inizia la compilazione. Il nome del progetto importante, perch pu essere riutilizzato come variabile allinterno del build.xml per creare pacchetti per la distribuzione. Ad esempio, potreste dichiarare il nome del software come Pippo e poi in fase di creazione del pacchetto, aggiungere a questo nome il numero di versione e lestensione del file. Il risultato sar Pippo-1.0.zip. Il nome del progetto sar utilizzabile in una qualunque parte del file build.xml come una sorta di variabile stringa Java. La sintassi da utilizzare per richiamare queste variabili ${nomevariabile}. Nel caso del nome del progetto si utilizza ${ant.project.name}. Questa sorta di variabili si chiamano property. Ant ne definisce diverse a cui possiamo facilmente accedere. Contengono informazioni come il classpath, il nome del sistema operativo, la versione della virtual machine ecc. Ecco un esempio banale di come si pu richiamare una property:

<target name=build> <zip destfile=${ant.project.name}-1.0.zip basedir=classes /> </target>

In questa maniera possibile creare un archivio con il contenuto di una directory chiamata classes. Questo comando disponibile in tutti i sistemi operativi ed veramente molto potente. Il tag zip chiamato task. I task sono delle direttive di Ant che implementano operazioni. Esiste una lista di task gi disponibili in Ant, e questi rappresentano la libreria standard. Inoltre, per chi non si accontenta, disponibile un numero notevole di task di terze parti per le funzionalit pi diverse. I target Il cuore di ogni build.xml sono i target: tutto avviene al loro interno. Sono questi che definiscono il flusso delle operazioni, seguendo le dipendenze. Ogni target ha un nome, una lista di altri target da cui dipende,

32

n.2 - gennaio/febbraio 2007

JAVA Journal
una descrizione e due attributi if e unless che ne determinano lesecuzione. Un esempio di target completo il seguente: <target
name=compile depends=init,setup description=descrizione if=a unless=b> </target>

educational

Questo target si chiama compile, dipende dallesecuzione di altri due target init e setup (nella seguenza indicata nellXML) e sar eseguito se la variabile a sar settata e se la variabile b non sar settata. Pensate quindi ad un target specifico, che deve essere eseguito solamente in un determinato caso; potete valorizzare una variabile che rappresenta lo stato booleano di quel caso. Nel caso in cui quella particolare variabile sar valorizzata, i task presenti allinterno del target saranno eseguiti. Raramente ho utilizzato gli attributi if e unless. Anche perch possibile richiamare esplicitamente lesecuzione di un altro target, e di conseguenza condizionarlo. Solamente il nome obbligatorio, gli altri attributi possono essere tralasciati, oppure inseriti in varie combinazioni in base alle caratteristiche che dovr avere il target. Per esempio, if e unless compaiono di rado insieme. La pratica comune quella di creare innanzitutto target che racchiudono comandi destinati ad uno scopo preciso. Il passo successivo inserire le dipendenze fra questi target, in modo che lesecuzione di un target causi a cascata lesecuzione di tutti gli altri. Un probabile target init potrebbe contenere una lista di task mkdir: questi creano la struttura del file system di partenza per la compilazione e la creazione del pacchetto software da distribuire. Esempio:
<target name=init> <mkdir dir=build/> <mkdir dir=dist/> </target>

che ci permettono di caricare in automatico lultima versione del software su un server FTP e magari segnalare automaticamente via mail della sua creazione. Per queste funzionalit esistono gi dei task, ma se proprio non vi accontentate potete crearvi un task personalizzato. Larchitettura di Ant flessibile e permette lintroduzione di altri task personalizzati. Per creare un proprio task basta estendere la classe Task di Ant. Comunque reputo remota la necessit di dover scrivere un proprio task. Fra i pi importanti task di terze parti ricordo: JUnit, FTP e MS Visual SourceSafe. Alcune di questi sono, ovviamente, utilizzabili solo su piattaforme specifiche. Ad esempio, il task per lavorare con SourceSafe non pu essere utilizzato su Linux proprio perch il software di Microsoft non disponibile per questa piattaforma. Ant nelle applicazioni Java Ant nato dallesigenza di sviluppatori Java; infatti i primi target a nascere sono stati: Javac Java Javadoc Jar

Questi infatti sono presenti fin dagli albori del progetto. Ant un ottimo strumento di sviluppo per un progetto Java e pu essere utilizzato per eseguire le varie fasi. Le fasi standard di un progetto Java, possono essere riassunte in: 1. 2. 3. 4. 5. 6. Inizializzazione dellambiente (init) Compilazione dei sorgenti (compile) Creazione dellarchivio jar (build) Generazione della documentazione Javadoc (doc) Creazione del pacchetto per la distribuzione (dist) Rimozione dei file generati (clean)

Nella directory build andranno a finire i file compilati e nella directory dist verrano spostati i file binari e gli altri file che andranno a far parte del pacchetto finale da distribuire. Pi avanti presenter un file di build da utilizzare per un progetto software Java. La libreria standard dei task La libreria standard dei task di Ant molto vasta e comprende strumenti basilari per la manipolazione di codice Java ma anche del file system e per altri migliaia di scopi. Non si possono elencare qui tutti i task, pertanto nella Tabella 1 riportata una lista dei pi importanti con a fianco una breve descrizione. Con i task racchiusi in questa piccola lista possibile fare gi parecchie cose. Nella maggior parte dei casi infatti, ci si limita a creare directory, compilare, spostare e archiviare. Quasi tutto il lavoro si basa su operazioni specifiche su file system. Ovviamente interessante inserire task

La generazione della documentazione non necessaria ma in un progetto che si rispetti lo sviluppatore rilascia sempre la documentazione autogenerata da Javadoc. Ad ogni voce di questo elenco va associato un target specifico. Prendiamo come esempio la preparazione di un pacchetto di rilascio per una classe HelloWord.java. Allinterno di questi target far uso di propriet che inizializzer con visibilit globale nel progetto. Inizializzazione dellambiente Preparare un ambiente per il rilascio di un pacchetto, significa creare le directory che conterranno i file compilati e il resto dei file che andranno a far parte della distribuzione. Questo target lo chiameremo init e non avr dipendenze con altri target. Allinterno di questo target metteremo i task che creeranno le directory.
<!-- Inizializzazione --> <target name=init> <mkdir dir=${build}/>

n.2 - gennaio/febbraio 2007

33

educational

JAVA Journal
vadoc --> <target name=doc> <javadoc packagenames=com.* sourcepath=${src} destdir=${doc} author=true version=true /> </target> <!-- Creazione del pacchetto per la distribuzione --> <target name=dist depends=build,doc> <zip destfile=${dist}/ ${ant.project.name}-${version}.zip> <fileset dir=. includes =${ant.project.name}.jar /> <fileset dir=. includes=${doc}/**/* /> </zip> </target> <!-- Rimozione dei file e directory generati --> <target name=clean> <delete dir=${build}/> <delete dir=${dist}/> <delete dir=${doc}/> <delete file=${ant.project.name} .jar/> </target> </project>

<project name=HelloWord default=dist basedir=.> <!-- proprieta utilizzate allinterno dei target --> <property name=src value=src /> <property name=build value=build /> <property name=dist value=dist /> <property name=doc value=doc /> <property name=version value=1.0 /> <!-- Inizializzazione dellambiente --> <target name=init> <mkdir dir=${build}/> <mkdir dir=${build}/classes/> <mkdir dir=${dist}/> <mkdir dir=${doc}/> </target> <!-- Compilazione dei sorgenti --> <target name=compile depends=init> <javac srcdir=${src} destdir=${build}/classes /> </target> <!-- Creazione dellarchivio jar --> <target name=build depends=compile> <jar destfile=${ant.project.name }.jar basedir=${build}/classes/> </target> <!-- Generazione della documentazione ja-

LISTATO 1 Scheletro di un file build.xml


<mkdir dir=${build}/classes/> <mkdir dir=${dist}/> <mkdir dir=${doc}/> </target> srcdir=${src} destdir=${build}/classes /> </target>

Creazione dellarchivio jar Compilazione dei sorgenti La compilazione dei sorgenti Java una pratica fondamentale e si basa tutta sul task Javac, che riproduce le funzionalit del programma javac, distribuito con il JDK. Questo task permette di compilare le classi Java partendo da una directory base, dove sono presenti i sorgenti. Si possono specificare i package e molti altri parametri, come ad esempio il target della JVM. Questo target dipende dallesecuzione del target precedente. Al suo interno dichiarato il task Javac con i parametri srcdir e destdir che contengono, rispettivamente, la directory dei sorgenti e la directory di destinazione delle classi compilate.
<!-- Compilazione dei sorgenti --> <target name=compile depends=init> <javac

A questo punto, dobbiamo creare larchivio jar della classe. Come per la compilazione, la creazione di un archivio jar si basa su un unico task che accetta diversi parametri di configurazione. Si pu creare un archivio partendo dal contenuto di una intera directory, oppure si possono specificare i file, utilizzando anche caratteri wildcard. Nel caso specifico, creiamo larchivio dal contenuto dellintera directory classes presente allinterno della directory build.
<!-- Creazione dellarchivio jar --> <target name=build depends=compile> <jar destfile=${ant.project.name}.jar basedir=${build}/classes/> </target>

34

n.2 - gennaio/febbraio 2007

JAVA Journal
# ant Buildfile: build.xml init: [mkdir] [mkdir] [mkdir] [mkdir] Created Created Created Created dir: dir: dir: dir: /Users/michele/Desktop/Articolo /Users/michele/Desktop/Articolo /Users/michele/Desktop/Articolo /Users/michele/Desktop/Articolo Ant/esempi/build Ant/esempi/build/classes Ant/esempi/dist Ant/esempi/doc

educational

compile: [javac] Compiling 1 source file to /Users/michele/Desktop/Articolo Ant/esempi/build/classes build: [jar] Building jar: /Users/michele/Desktop/Articolo Ant/esempi/HelloWord.jar doc: [javadoc] [javadoc] [javadoc] [javadoc] [javadoc] [javadoc] [javadoc] [javadoc] dist: [zip] Building zip: /Users/michele/Desktop/Articolo Ant/esempi/dist/HelloWord-1.0.zip BUILD SUCCESSFUL Total time: 4 seconds Generating Javadoc Javadoc execution Loading source files for package com.acme... Constructing Javadoc information... Standard Doclet version 1.4.2_09 Building tree for all the packages and classes... Building index for all the packages and classes... Building index for all classes...

LISTATO 2 Targets che genera un archivio zip la compressione, la lista dei file da includere ecc. La sua esecuzione dipende da quella del target build e poi del target doc.
<!-- Creazione del pacchetto per la distribuzione --> <target name=dist depends=build,doc> <zip destfile=${dist}/${ant.project.name}-${version}.zip> <fileset dir=. includes=${ant.project.name}.jar /> <fileset dir=. includes=${doc}/**/* /> </zip> </target>

Generazione della documentazione javadoc In Java possiamo documentare il codice mentre lo scriviamo. In un secondo tempo, con lo strumento javadoc, possibile generare la documentazione in formato HTML delle classi. In questo target, chiamato doc si genera la documentazione per la classe HelloWord e per tutte quelle classi che appartengono ad un package che inizia per com.
<!-- Generazione della documentazione javadoc --> <target name=doc> <javadoc packagenames=com.* sourcepath=${src} destdir=${doc} author=true version=true/> </target>

Rimozione dei file e directory generati Questo target non fa parte di una procedura di build ma definisce tutte le operazioni necessarie affinch lambiente ritorni nello stato iniziale. Ci garantisce che in una nuova procedura di build non si trovi sporcizia lasciata dalla precedente. Questo target si chiama clean e va lanciato prima di rieseguire nuovamente il file di build.
<!-- Rimozione dei file e directory generati --> <target name=clean> <delete dir=${build}/>

Creazione del pacchetto per la distribuzione Il pacchetto per la distribuzione sar un file zip contenente larchivio jar appena creato e la directory con la documentazione. Il task per compiere questa operazione zip e, come gli altri, ha una serie di parametri per definire

n.2 - gennaio/febbraio 2007

35

educational

JAVA Journal
di distribuzione di una estensione che ho realizzato per Mozilla Firefox. Per esempio, volendo creare le pagine HTML di un sito Internet si potrebbe partire dal contenuto di un file XML, applicare un file XSLT a questo XML e avere in uscita uno o pi file HTML. Sempre con Ant sarebbe possibile caricare, via FTP, quellHTML sul server del provider del nostro servizio di hosting. Il task XSLT potrebbe essere usato anche per generare versioni distribuibili di documenti scritti con DocBook.

<delete dir=${dist}/> <delete dir=${doc}/> <delete file=${ant.project.name}.jar/> </target>

Assemblando tutti questi target assieme, otteniamo il file di build definitivo, riprodotto nel Listato 1. Il primo target ad essere chiamato sar dist e il flusso di esecuzione sar: init, compile, build, doc, dist. In cima, prima della dichiarazione del target init, sono presenti cinque dichiarazioni di property:
<!-- proprieta utilizzate allinterno dei target --> <property name=src value=src /> <property name=build value=build /> <property name=dist value=dist /> <property name=doc value=doc /> <property name=version value=1.0 />

Ant nacque proprio


da questa esigenza: quella di poter eseguire una serie di operazioni indipendentemente dal sistema operativo
Conclusione Ant uno strumento di lavoro estremamente utile e completo. Viene utilizzato in ambito open source nei progetti della fondazione Apache e in moltissimi progetti commerciali. Alcune delle aziende pi influenti nel panorama Java, come Bea, rilasciano task per lintegrazione con i loro prodotti. Viene supportato da quasi tutti gli IDE Java in circolazione. Ne cito solamente alcuni: JBuilder, Eclipse e NetBeans. Non vorrei sbagliarmi, ma credo che, NetBeans lo utilizzi come motore per eseguire azioni allinterno dellambiente di sviluppo. Alcuni di questi IDE sono provvisti di wizard grafici per la creazione di file Ant. Non si tratta di un progetto Java sconosciuto ma di uno standard de facto apprezzato e riconosciuto da tutti gli sviluppatori Java. Non a caso sono nati alcuni progetti cloni come Nant (http://nant.sourceforge.net/) che cercano di riprodurre le funzionalit per ambienti diversi da Java, come .NET. Bibliografia [1]_Home page del progetto Apache Ant (http:// ant.apache.org/) [2]_Manuale ufficiale di Ant (http://ant.apache.org/ manual/index.html) [3]_Alcuni tutorial su Ant (http://blog.ideoplex.com/ software/java/#ant) [4]_Wiki_su_Ant_(http://en.wikibooks.org/wiki/ Programming:Apache_Ant) Note Biografiche
Michele Ferretti un giovane programmatore che si occupa di sviluppo Java per lavoro e nel tempo libero si diletta con Python ed ultimamente con il mondo Ruby e Ruby On Rails

Si tratta di quattro directory e della stringa che identifica la versione del software. In genere, qui si inseriscono anche eventuali informazioni su: autore, data di creazione, copyright, ecc. Vediamo ora se il file appena creato funziona. Per convenzione lo rinominiamo build.xml e dal prompt di comando digitiamo il relativo comando. Nel Listato 2 mostrato un esempio di compilazione. Loutput di Ant permette di capire se andato tutto bene o se ci sono stati dei problemi, ed eventualmente la causa di questi problemi. La maggior parte dei task di Ant, se va in errore, blocca lesecuzione dellintero file. Questa caratteristica di Ant molto importante, perch inutile continuare nella compilazione di una classe se non si riusciti a creare la sua directory di destinazione. Se abbiamo bisogno di ricreare di nuovo il pacchetto, perch nel frattempo abbiamo aggiunto un metodo alla nostra classe, prima dobbiamo ripulire lambiente. Il target clean stato creato proprio a questo scopo. Per eseguirlo digitiamo:
# ant clean

e il risultato sar la cancellazione di tutti file In generale se volete richiamare lesecuzione di un target particolare, potete farlo specificando il suo nome come primo dei parametri del comando ant. Quindi se volete solo rigenerare la documentazione potete usare:
# ant doc

Ant per usi diversi da Java Apache Ant un progetto nato per uno scopo preciso: la compilazione dei programmi in Java. Con gli anni per, ci si resi conto che risulta adatto ad eseguire unenorme quantit doperazioni. Ci sono persone che lo utilizzano per creare siti Internet oppure per sostituire operazioni ridondanti che prima descrivevano in file batch. Personalmente, lo utilizzo per creare il pacchetto

36

n.2 - gennaio/febbraio 2007