Automatizza il tuo processo di compilazione utilizzando Java e Ant

Un processo definito è uno degli strumenti più necessari ma spesso meno utilizzati nello sviluppo del software. È per sua natura un compito generale che accompagna uno sforzo di sviluppo. Un processo di compilazione definito garantisce che il software nel progetto di sviluppo venga compilato esattamente nello stesso modo ogni volta che viene eseguita una compilazione. Man mano che il processo di creazione diventa più complesso, ad esempio con build EJB o attività aggiuntive, diventa più necessario raggiungere tale standardizzazione. È necessario stabilire, documentare e automatizzare il più possibile la serie esatta di passaggi.

Perché ho bisogno di un processo di compilazione definito?

Un processo di compilazione definito è una parte essenziale di qualsiasi ciclo di sviluppo perché aiuta a colmare il divario tra gli ambienti di sviluppo, integrazione, test e produzione. Un processo di compilazione da solo accelererà la migrazione del software da un ambiente a un altro. Rimuove anche molti problemi relativi alla compilazione, al percorso di classe o alle proprietà che costano tempo e denaro a molti progetti.

Cos'è Ant?

Ant è uno strumento di scripting indipendente dalla piattaforma che ti consente di costruire i tuoi script di compilazione più o meno allo stesso modo dello strumento "make" in C o C ++. Puoi utilizzare un gran numero di attività integrate in Ant senza alcuna personalizzazione. Alcune delle attività più importanti sono mostrate nella tabella seguente ma spiegate in maggior dettaglio nell'esempio che segue.

Ecco alcuni comandi utili che sono costruiti nella distribuzione Ant.

Comando Descrizione
Formica Utilizzato per eseguire un altro processo di formica dall'interno di quello corrente.
Copydir Utilizzato per copiare un'intera directory.
Copia il file Utilizzato per copiare un singolo file.
Cvs Gestisce pacchetti / moduli recuperati da un repository CVS.
Elimina Elimina un singolo file o tutti i file in una directory specificata e nelle relative sottodirectory.
Deltree Elimina una directory con tutti i suoi file e sottodirectory.
Exec Esegue un comando di sistema. Quando viene specificato l'attributo os, il comando viene eseguito solo quando Ant viene eseguito su uno dei sistemi operativi specificati.
Ottenere Ottiene un file da un URL.
Vaso Elimina una serie di file.
Giava Esegue una classe Java all'interno della VM (Ant) in esecuzione o esegue il fork di un'altra VM, se specificato.
Javac Compila un albero dei sorgenti all'interno della VM (Ant) in esecuzione.
Javadoc / Javadoc2 Genera la documentazione del codice utilizzando lo strumento javadoc.
Mkdir Crea una directory.
Proprietà Imposta una proprietà (per nome e valore) o un insieme di proprietà (da file o risorsa) nel progetto.
Rmic Esegue il compilatore rmic per una certa classe.
Timbro Imposta le proprietà DSTAMP, TSTAMP e TODAY nel progetto corrente.
Stile Elabora una serie di documenti tramite XSLT.

Sebbene siano disponibili altri strumenti per creare build software, Ant è facile da usare e può essere padroneggiato in pochi minuti. Inoltre, Ant ti consente di creare funzionalità espanse estendendo alcune delle sue classi. Mostrerò questa espansione in un esempio seguente.

Di cosa ho bisogno per usare Ant?

È necessario installare tre componenti sulla macchina per eseguire Ant: JDK, parser XML e Ant (vedere Risorse per i collegamenti).

In molti casi, il parser XML fa parte dei file lib distribuiti con Servlet runner o Web Server. In caso contrario, è sufficiente il parser XML gratuito di java.sun.com.

L'installazione di Ant consiste nel scaricare i file, aggiungere le librerie di classi al percorso di classe e aggiungere i binari di Ant al percorso.

Scenario di esempio

Questo scenario di esempio dovrebbe aiutarti a mostrare il valore di Ant e fornire informazioni sui suoi vantaggi e su come utilizzarlo.

Poiché gran parte dell'attuale sviluppo Java è incentrato su Java lato server, ho scelto un'applicazione lato server per l'esempio. Gli sviluppatori che lavorano su applicazioni Java lato server sono generalmente interessati alla compilazione di servlet, alla distribuzione di file JSP e alla distribuzione di file HTML, file di configurazione o immagini.

Uno schema comune per eseguire questa build implicherebbe lo sviluppo di piccoli script in linguaggi specifici della piattaforma basati sul sistema operativo del server. Ad esempio, uno sviluppatore che lavora su una macchina NT potrebbe creare un file batch che esegue le attività di compilazione e quindi esegue la distribuzione. Tuttavia, se l'ambiente di produzione avesse Unix o Linux, lo sviluppatore avrebbe dovuto riscrivere lo script, assicurandosi che gli script fossero sincronizzati.

OK, fammi vedere come funziona

Quindi, spero di averti convinto della necessità di usare Ant e mostrato quanto sia semplice da installare. Ora ti mostrerò quanto sia semplice utilizzare Ant passando attraverso un esempio che esegue una semplice compilazione e distribuzione.

Processo di compilazione semplice con Ant (simple.xml)


  

C'è molto da spiegare nell'esempio sopra. Innanzitutto, dovresti comprendere la struttura del file simple.xml. È un file XML ben formattato contenente un'entità del progetto composta da diverse entità di destinazione.

La prima riga contiene informazioni sul progetto complessivo che deve essere costruito.


  

Gli elementi più importanti della linea del progetto sono il defaulte il basedir.

L' defaultattributo fa riferimento alla destinazione predefinita che deve essere eseguita. Poiché Ant è uno strumento di compilazione della riga di comando, è possibile eseguire solo un sottoinsieme dei passaggi di destinazione nel file Ant. Ad esempio, potrei eseguire il seguente comando:

% ant -buildfile simple.xml init 

Ciò eseguirà il antcomando e attraverserà il file simple.xml fino a initraggiungere l' obiettivo. Quindi, in questo esempio, il valore predefinito è deploy. Il processo Ant invocato nella riga seguente verrà eseguito attraverso il simple.xmlfile fino a quando non deployviene raggiunto il comando:

% ant -buildfile simple.xml 

L' basedirattributo è abbastanza autoesplicativo in quanto è la directory di base da cui vengono recuperati i riferimenti relativi contenuti nel file di compilazione. Ogni progetto può avere un solo basedirattributo, quindi puoi scegliere di includere il percorso della directory completo o suddividere il file di progetto di grandi dimensioni in file di progetto più piccoli con basedirattributi diversi .

La linea di interesse successiva è la linea di destinazione. Qui vengono mostrate due diverse versioni:


  

L' targetelemento contiene quattro attributi: name, if, unless, e depends. Ant richiede l' nameattributo, ma gli altri tre attributi sono opzionali.

Utilizzando depends, è possibile impilare le attività Ant in modo che un'attività dipendente non venga avviata fino al completamento dell'attività da cui dipende. Nell'esempio precedente, l'attività pulita non verrà avviata fino al initcompletamento dell'attività. L' dependsattributo può anche contenere un elenco di valori separati da virgole che indicano diverse attività da cui dipende l'attività in discussione.

I comandi ife unlessconsentono di specificare i comandi che devono essere eseguiti se è impostata una determinata proprietà oa meno che tale proprietà non sia impostata. La ifeseguirà quando il valore della proprietà è impostata, e la unlesseseguirà se il valore non è impostato. È possibile utilizzare il availablecomando per impostare tali proprietà come mostrato in un esempio seguente, oppure è possibile impostarle tramite la riga di comando.

La initdestinazione del semplice esempio contiene quattro righe di propertycomandi come mostrato qui:


  

Queste propertyrighe consentono di specificare directory o file di uso comune. Una proprietà è una semplice coppia di valori nome che consente di fare riferimento alla directory o al file come un'entità logica piuttosto che fisica.

Se si voleva fare riferimento alla sourceDirvariabile più avanti nel file Ant, si può semplicemente utilizzare la seguente sintassi per avviso Ant per ottenere il valore per questo tag: ${sourceDir}.

Altri due comandi presenti nel buildfile sopra sono:


  

Questi comandi vengono utilizzati per garantire che non vi siano file estranei nella directory outputDir(o classesquando dereferenziato come indicato sopra). Il primo comando rimuove l'intero albero contenuto sotto il file outputDir. Il secondo comando crea nuovamente la directory.

L'ultima riga di maggiore interesse per lo sviluppatore è la seguente riga di compilazione:


  

Il javaccomando richiede una directory di origine (la posizione di input dei file .java) e una directory di destinazione (la posizione di output del file .classes). È importante notare che tutte le directory devono esistere prima dell'esecuzione del antcomando o essere create utilizzando il mkdircomando. Ant non crea directory in base all'intuizione, quindi è necessario creare le outputDir, utilizzando il mkdircomando prima del passaggio di compilazione sopra.

Dopo che l' compileattività è stata completata, l' deployattività eseguirà l'operazione di copia per spostare tutti i file JSP dalla directory di origine a una directory di distribuzione. Utilizzando il copydircomando, si copia l'intera directory JSP da un'ubicazione a un'altra. Ho usato il copyfilecomando per copiare un singolo file delle proprietà come parte della build.

Sebbene siano state necessarie diverse righe per spiegare l'esempio, dovrebbe essere evidente che Ant è uno strumento facile da usare. Usando questo file build come punto di partenza, dovresti essere in grado di incorporare Ant nel tuo sforzo di sviluppo. I antcomandi mostrati nell'esempio precedente hanno ulteriori funzionalità, alcune delle quali verranno discusse in questo articolo, il resto è lasciato a te insieme ai riferimenti alla documentazione.

Compiti importanti

È lasciato a te leggere le attività integrate incluse nella distribuzione Ant. Vedere la guida per l'utente in Risorse per informazioni su ciascun comando. Ho scelto due comandi comunemente usati come esempi di opzioni aggiuntive disponibili per il build manager senza alcuna personalizzazione.

Compilazione del codice (inclusi EJB)

Nel semplice esempio discusso in precedenza, hai visto una forma semplice del javaccomando. Ora, se lo esamini più in dettaglio, vedrai che puoi specificare i flag di compilazione come deprecazione, debug o ottimizzazione così come i file che saranno o non saranno inclusi nella compilazione.


  

È possibile utilizzare le include/excludeentità all'interno dell'attività javacper includere / escludere file che corrispondono al modello namenell'attributo dalla compilazione. Dall'esempio precedente, si desidera includere i file contenuti in qualsiasi directory che termina con .java ma, allo stesso tempo, si desidera escludere i file denominati Script.java a meno che una proprietà non bsf.presentsia impostata su true.

Si imposta la bsf.presentproprietà utilizzando la seguente attività che cerca il classpath per il nome di classe specificato e imposta in bsf.presentbase ai risultati della ricerca:


  

Il javaccomando non includerà file chiamati version.txt dalla compilazione basata sul comando exclude sopra.

Generazione di javadoc

Un altro compito che Ant può aiutare ad automatizzare è la generazione di javadoc. È possibile utilizzare il seguente comando per generare il javadoc:


  

I pacchetti specificano i pacchetti complessivi che javadoc includerà. L' sourcepathattributo punta verso la posizione dei file di origine. Il javadoccomando fornisce anche attributi che consentono di specificare il titolo della finestra e del documento. Puoi anche includere un avviso di copyright in fondo a ogni pagina javadoc, utilizzando l' bottomattributo.

Può Ant fare XYZ?

A questo punto, hai visto alcune delle possibili attività nel tuo processo di compilazione che Ant può automatizzare. Queste attività sono incluse immediatamente in Ant. Potresti voler personalizzare Ant per aiutarti a eseguire alcune attività più difficili come la creazione di EJB e l'esecuzione della gestione della configurazione remota. Alcuni di voi potrebbero voler aumentare le capacità di reporting di Ant o costruire un'interfaccia utente in grado di eseguire il processo Ant.

La semplice risposta alla domanda "Can Ant do XYZ?" è "Sì, ma potrebbe essere necessario personalizzarlo".

Estendere Ant

È interessante discutere a questo punto due estensioni Ant. Sono aumentati i rapporti e la possibilità di distribuire il codice da remoto utilizzando Ant.

Miglioramenti nei rapporti