I. INSTALLATION▲
Peu importe le fait que ce tutoriel soit basé sur la dernière version de Apache Ant ou que nous recherchions une version antérieure, il est intéressant de consulter la page officielle du projet : http://ant.apache.org qui s'avère être une véritable mine d'informations. En effet, la fondation Apache y propose par exemple, en sus d'un ensemble considérable de ressources, la possibilité de vérifier l'intégrité des données téléchargées par PGP. Ainsi, nous pouvons être assuré de ne pas installer un quelconque Spyware ou autre contenu corrompu.
Notons au passage que le JDK1.4 de Sun (resp. JDK1.5) est supporté à partir de la version 1.5 de Ant (resp. 1.6.1). Ci-dessous les liens directs vers les versions binaires.
Version | Date de sortie |
1.1 | 19/07/2000 |
1.2 | 24/10/2000 |
1.3 | 03/03/2001 |
1.4 | 03/09/2001 |
1.4.1 | 11/10/2001 |
1.5 | 10/07/2002 |
1.5.1 | 03/10/2002 |
1.5.2 | 03/03/2003 |
1.5.3 | 09/04/2003 |
1.5.4 | 12/08/2003 |
1.6.0 | 18/12/2003 |
1.6.1 | 12/02/2004 |
1.6.2 | 16/07/2004 |
1.6.3 | 28/04/2005 |
1.6.4 | 19/05/2005 |
1.6.5 | 02/06/2005 |
Dans les versions 1.6.4 et 1.6.5, les bugs suivants ont été fixés :
- Sun javah failed with java.lang.NoClassDefFoundError. Bugzilla report 34681 ;
- DirectoryScanner.slowScan() was broken. Bugzilla report 34722 ;
- DirectoryScanner.scan() could throw a NullPointerException on case-insensitive filesystems (read Windows or MacOS X) ;
- Get w/authentication failed with ArrayOutOfBoundsExceptions. Bugzilla report 34734 ;
- Granularity attribute for task was undocumented. Bugzilla report 34871 ;
- <unzip> and <untar> could leave file handles open on invalid archives. Bugzilla report 34893 ;
- propertyset threw NPE with nested, mapped propertysets ;
- <ftp> up to date calculations were wrong. Bugzilla report 34941 ;
- AntXMLContext.setCurrentTargets() is now public. Bugzilla report 34680 ;
- <move> was unable to replace existing files or write into existing directories. Bugzilla report 34962 ;
- <macrodef> with redefined default values was incorrect. Bugzilla report 35109 ;
- <javadoc> will convert backslashes to forwardslashes when generating file list by useexternalfile. Bugzilla report 27814.
Bien que la distribution binaire de Ant contienne quatre répertoires : bin, lib, docs et etc, seuls les deux premiers sont utiles pour démarrer. Pour installer Ant, choisissons un répertoire et plaçons-y la source. Le répertoire sera connu sous le nom de ANT_HOME. Pour nous faciliter la tâche, choisissons le chemin le plus court possible, par exemple, C:\\Ant\. En effet, sous Windows, lors d'une écriture disque, le nom des fichiers est stocké sous 2 formes. La première permet d'avoir des noms de fichiers de 255 caractères alors que la seconde, héritée du temps du DOS, impose le format 8.3 (CHAR[8]+'.'+ CHAR[3]).
- Ajouter le contenu du répertoire bin/ ;
- Créer la variable d'environnement ANT_HOME correspondant au répertoire d'installation de votre distribution ;
- Si ce n'est déjà fait, créer de même une variable d'environnement JAVA_HOME.
- Ouvrir regedit ;
- Aller dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Filesystem ;
- Modifier DWORD (par défaut à 0) NtfsDisable8dot3NameCreation à 1 ;
- Relancer Windows.
II. STRUCTURE DU BUILD.XML▲
II-A. PROJECT▲
Les fichiers de construction de Ant sont écrits en XML. Chacun d'eux correspond à ce que nous appelerons un projet i.e, project. Ce dernier peut posséder jusqu'à quatre attributs et constitue la partie essentielle du fichier :
Attributs | Description | Optionnel |
name | Le nom du projet | Oui |
default | La cible par défaut lorsqu'aucune autre n'est spécifiée | Oui depuis la version 1.6.0 |
basedir | Le répertoire de base d'où partent les chemins requis. | Oui |
description | La description globale du fichier de construction | Oui |
Supposons que nous souhaitions créer un projet HelloWorld à la racine du système, en l'occurence C:\\HelloWorld, dans lequel nous placerions le fichier de construction. La déclaration du projet se ferait alors ainsi et la tâche main serait celle appelée par défaut :
<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.
<
/
description
>
<
/
project
>
II-B. TARGET▲
Chaque projet défini une ou plusieurs cibles i.e., target. Une cible est un ensemble de tâches que nous souhaitons exécuter. Quand nous lançons Ant, nous pouvons sélectionner la cible principale. Si nous n'en spécifions aucune, celle par défaut sera lancée.
Une cible peut dépendre d'autres cibles. Nous pourrions par exemple avoir une cible de compilation et une autre pour créer un exécutable. Or, nous ne pouvons créer l'exécutable qu'une fois les sources compilées, la cible d'exécution dépend donc de la cible de compilation.
- <target name="A"/> ;
- <target name="B" depends="A"/> ;
- <target name="C" depends="B"/> ;
- <target name="D" depends="C,B,A"/>.
Établir des conditions sur les cibles s'écrira comme ci-dessous, mais sans contrainte, la cible sera toujours exécutée :
- <target name="build-module-A" if="module-A-present"/> ;
- <target name="build-own-fake-module-A" unless="module-A-present"/>.
Une cible peut contenir les attributs suivants :
Attributs | Description | Optionnel |
name | Le nom de la cible | Non |
depends | La liste des cibles dont dépend cette cible | Oui |
if | Le nom de la propriété qui doit être impérativement établie avant l'exécution de la cible | Oui |
unless | Le nom de la propriété qui n'a pas besoin d'être établie avant l'éxécution de la cible | Oui |
description | Une courte description de la fonction de la cible | Oui |
Définissons alors quatre cibles : l'initialisation init dont dépend la tâche de compilation compil dont dépend elle-même la tâche principale main et enfin, une tâche de nettoyage clean
<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.
<
/
description
>
<
target
name
=
"
init
"
description
=
"
construit
l'arborescence
cible
"
>
<
/
target
>
<
target
name
=
"
compil
"
depends
=
"
init
"
description
=
"
compile
les
sources
"
>
<
/
target
>
<
target
name
=
"
main
"
depends
=
"
compil
"
description
=
"
génère
l'archive
"
>
<
/
target
>
<
target
name
=
"
clean
"
description
=
"
nettoie
tous
les
répertoires
générés
"
>
<
/
target
>
<
/
project
>
II-C. PROPERTY▲
Un projet peut contenir un ensemble de propriétés. Une propriété i.e, property a un nom et une valeur. Par exemple, s' il y a une propriété « builddir » avec la valeur « build », alors elle peut être utilisée comme valeur d'argument ${builddir}/classes (équivaut à build/classes). Une propriété est « case-sensitive ».
Il est ainsi possible de définir plusieurs répertoires de travail :
<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.
<
/
description
>
<
property
environment
=
"
env
"
/
>
<
property
name
=
"
src
"
value
=
"
${basedir}/src
"
/
>
<
property
name
=
"
build
"
value
=
"
${basedir}/build
"
/
>
<
target
name
=
"
init
"
description
=
"
construit
l'arborescence
cible
"
>
<
/
target
>
<
target
name
=
"
compil
"
depends
=
"
init
"
description
=
"
compile
les
sources
"
>
<
/
target
>
<
target
name
=
"
main
"
depends
=
"
compil
"
description
=
"
génère
l'archive
"
>
<
/
target
>
<
target
name
=
"
clean
"
description
=
"
nettoie
tous
les
répertoires
générés
"
>
<
/
target
>
<
/
project
>
II-D. BUILT-IN PROPERTY▲
Ant possède lui aussi quelques propriétés qui lui sont propres i.e, built-in property : vous pouvez constater l'emploi de basedir dans le fichier de construction ci-dessus.
Propriété | Description |
basedir | Le chemin de base du projet |
ant.file | Le chemin du fichier de construction |
ant.version | La version de Ant |
ant.project.name | Le nom du projet actuellement éxécuté |
ant.java.version | La version de Java utilisée |
Par héritage, il permet l'accés à toutes les propriétés du système comme si elles avaient été définies en tant que simples propriétés. Par exemple, ${os.name} renvoie le nom du système opérant. La classe System Java maintient un ensemble de propriétés, des paires clé/valeur qui définissent des attributs du système de travail. Quand le Runtime démarre, les propriétés de système sont initialisées pour contenir des informations sur l'environnement système comprenant entre autres, l'utilisateur, la version du Runtime Java et même le type de séparateur fichier. (À lire : Setting Java Properties with Ant).
Propriété | Description |
java.version | Version du JRE |
java.vendor | Fournisseur du JRE |
java.vendor.url | URL du fournisseur |
java.home | Répertoire d'installation Java |
java.vm.specification.version | Version de la spécification JVM |
java.vm.specification.vendor | Fournisseur de la spécification JVM |
java.vm.specification.name | Nom de la spécification JVM |
java.vm.version | Version de l'implémentation JVM |
java.vm.vendor | Fournisseur de l'implémentation JVM |
java.vm.name | Nom de l'implémentation JVM |
java.specification.version | Version de la spécification JRE |
java.specification.vendor | Fournisseur de la spécification JRE |
java.specification.name | Nom de la spécification JRE |
java.class.version | Numéro de version de classe Java |
java.class.path | Chemin de classe Java |
java.ext.dirs | Chemin de répertoire ou de répertoire externe |
os.name | Nom de l'OS |
os.arch | Architecture de l'OS |
os.version | Version de l'OS |
file.separator | Séparateur de fichiers |
path.separator | Séparateur de chemins |
line.separator | Séparateur de lignes |
user.name | Compte utilisateur |
user.home | Répertoire Home utlisateur |
user.dir | Répertoire de travail utilisateur |
II-E. TASK▲
Une tâche i.e, task est une partie de code pouvant être exécutée. Elle peut avoir de multiples arguments et possède la structure suivante :
- <taskname attribute1="value1" attribute2="value2" ... /> où taskname est le nom de la tâche, attributeN est le nom de l'argument et valueN est la valeur de cet argument ;
- <taskname id="taskID" ... /> où taskname est le nom de la tâche et taskID est un identifiant pour cette tâche.
Bien que nous puissions implémenter nos propres tâches, un certain nombre d'entre elles sont fournies par défaut. Parmi lesquelles :
- Des tâches d'archivage : À noter que la tâche JLink est dépréciée.
Tâche Description gunzip/bunzip2 Défait une archive GZip/BZip2 gzip/bzip2 Génère une archive GZip/BZip2 cab Génère une archive CAB Microsoft ear Génère une archive EAR jar Génère une archive JAR war Génère une archive WAR manifest Crée un fichier Manifest rpm Génère une archive RPM signjar Signe une archive jar par le biais de javasign tar Génère une archive TAR unjar Défait une archive JAR untar Défait une archive TAR unwar Défait une archive WAR unzip Défait une archive ZIP zip Génère une archive ZIP build.xmlSélectionnez<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.<
/
description
>
<
property
environment
=
"
env
"
/
>
<
property
name
=
"
src
"
value
=
"
${basedir}/src
"
/
>
<
property
name
=
"
build
"
value
=
"
${basedir}/build
"
/
>
<
target
name
=
"
init
"
description
=
"
construit
l'arborescence
cible
"
>
<
/
target
>
<
target
name
=
"
compil
"
depends
=
"
init
"
description
=
"
compile
les
sources
"
>
<
/
target
>
<
target
name
=
"
main
"
depends
=
"
compil
"
description
=
"
génère
l'archive
"
>
<
jar
jarfile
=
"
${build}/HelloWorld.jar
"
basedir
=
"
${build}
"
>
<
manifest
>
<
attribute
name
=
"
MAIN-CLASS
"
value
=
"
HelloWorld
"
/
>
<
/
manifest
>
<
/
jar
>
<
/
target
>
<
target
name
=
"
clean
"
description
=
"
nettoie
tous
les
répertoires
générés
"
>
<
/
target
>
<
/
project
>
- Des tâches d'audit :
Tâche Description jdepend Invoque JDepend (Infos produit) jprobe Invoque JProbe (Infos produit) mmetrics Invoque Metamata Metrics/WebGain Quality Analyzer sur des sources Java (Détails) maudit Invoque Metamata Metrics/WebGain QA à la fois sur les sources et le Byte-code résultant (Détails) - Des tâches de compilation :
Tâche Description depend Détermine les classes compilées dépréciées avec leurs sources respectives javac Compile des sources java jspC Lance le compilateur JSP netrexxc Compile des sources netrexx rmic Lance le compilateur rmic wljspc Lance le compilateur JSP associé à la solution Weblogic build.xmlSélectionnez<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.<
/
description
>
<
property
environment
=
"
env
"
/
>
<
property
name
=
"
src
"
value
=
"
${basedir}/src
"
/
>
<
property
name
=
"
build
"
value
=
"
${basedir}/build
"
/
>
<
target
name
=
"
init
"
description
=
"
construit
l'arborescence
cible
"
>
<
/
target
>
<
target
name
=
"
compil
"
depends
=
"
init
"
description
=
"
compile
les
sources
"
>
<
javac
srcdir
=
"
${src}
"
destdir
=
"
${build}
"
debug
=
"
on
"
deprecation
=
"
on
"
optimize
=
"
off
"
>
<
include
name
=
"
HelloWorld.java
"
/
>
<
/
javac
>
<
/
target
>
<
target
name
=
"
main
"
depends
=
"
compil
"
description
=
"
génère
l'archive
"
>
<
jar
jarfile
=
"
${build}/HelloWorld.jar
"
basedir
=
"
${build}
"
includes
=
"
META-INF/**
"
>
<
manifest
>
<
attribute
name
=
"
MAIN-CLASS
"
value
=
"
HelloWorld
"
/
>
<
/
manifest
>
<
/
jar
>
<
/
target
>
<
target
name
=
"
clean
"
description
=
"
nettoie
tous
les
répertoires
générés
"
>
<
/
target
>
<
/
project
>
- Des tâches de déploiement :
Tâche Description serverdeploy Lance le service de déploiement à chaud spécifique au serveur d'application utilisé (Weblogic ou JOnAS) - Des tâches de documentation :
Tâche Description javadoc/javadoc2 Génère une documentation par le biais de javadoc stylebook Génère une documentation par le biais de Apache Stylebook - Des tâches liées aux EJB :
Tâche Description blgenclient Borland Application Server 4.5 et 5.x ddcreator Weblogic 4.5.1 ejbc Weblogic 4.5.1 iplanet-ejbc iPlanet Application Server 6.0 ejbjar Borland Application Server 4.5 et 5.x, iPlanet Application Server 6.0, JBoss, JOnAS 2.4.x et 2.5, Weblogic 5.1 à 7.0, IBM WebSphere 4.0 wlrun Weblogic 5.1 à 7.0 wlstop Weblogic 5.1 à 7.0 - Des tâches d'exécution :
Tâche Description ant Lance Ant sur un autre fichier antcall Appelle une autre cible au sein d'une première apply Exécute une commande système dependset Gère les dépendances entre fichiers exec Exécute une commande système java Exècute des classes java au sein d'une même VM ou de processus fils parallel Exécute plusieurs tâches en parallèle sequential Exècute des tâches en séquentiel sleep Endort le processus pendant une certaine durée subant Appelle une cible dans un ensemble de sous projets waitfor Bloque l'exécution jusqu'à ce qu'un certain nombre de conditions soient respectées - Des tâches de manipulation de fichiers :
Tâche Description attrib Change les attributs et permissions de fichiers/répertoires sous Windows checksum Créer un checksum pour un fichier chgrp Change le groupe propriétaire sous Unix chmod Change les permissions sur un fichier chown Change le propriétaire d'un fichier sous Unix concat Assemble un ensemble de fichiers vers une cible copy Copie un ensemble de fichiers dans un autre ou vers un répertoire delete Efface un fichier, un répertoire et toute sa sous-arborescence filter Remplace les tokens posés par une nouvelle valeur fixclrf Ajuste un fichier texte aux règles de convention d'une locale get Récupère un fichier posé sur un point distant par son url mkdir Crée un répertoire move Déplace un fichier vers un autre ou un répertoire patch Applique un patch aux sources originales replace Remplace l'occurence d'une chaîne de caractères par une autre sync Synchronise un répertoire cible avec un ensemble de fichiers tempfile Pose un propriété sur un fichier temporaire touch Change l'heure de modification d'un fichier build.xmlSélectionnez<?
xml
version="1.0"
encoding="UTF-8"?
>
<
project
name
=
"
HelloWord
"
default
=
"
main
"
basedir
=
"
.
"
>
<
description
>
Notre HelloWorld build file.<
/
description
>
<
property
environment
=
"
env
"
/
>
<
property
name
=
"
src
"
value
=
"
${basedir}/src
"
/
>
<
property
name
=
"
build
"
value
=
"
${basedir}/build
"
/
>
<
target
name
=
"
init
"
description
=
"
construit
l'arborescence
cible
"
>
<
mkdir
dir
=
"
${build}
"
/
>
<
/
target
>
<
target
name
=
"
compil
"
depends
=
"
init
"
description
=
"
compile
les
sources
"
>
<
javac
srcdir
=
"
${src}
"
destdir
=
"
${build}
"
debug
=
"
on
"
deprecation
=
"
on
"
optimize
=
"
off
"
>
<
include
name
=
"
HelloWorld.java
"
/
>
<
/
javac
>
<
/
target
>
<
target
name
=
"
main
"
depends
=
"
compil
"
description
=
"
génère
l'archive
"
>
<
jar
jarfile
=
"
${build}/HelloWorld.jar
"
basedir
=
"
${build}
"
includes
=
"
META-INF/**
"
>
<
manifest
>
<
attribute
name
=
"
MAIN-CLASS
"
value
=
"
HelloWorld
"
/
>
<
/
manifest
>
<
/
jar
>
<
/
target
>
<
target
name
=
"
clean
"
description
=
"
nettoie
tous
les
répertoires
générés
"
>
<
delete
includeEmptyDirs
=
"
true
"
>
<
fileset
dir
=
"
${build}
"
/
>
<
/
delete
>
<
/
target
>
<
/
project
>
- Des tâches d'extension Java :
Tâche Description jarlib-available Vérifie et établit la présence d'une extension dans un FileSet ou un ExtensionSet jarlib-display Affiche les informations « Optional Package » et « Package Specification » contenues dans une archive JAR jarlib-manifest Génère un fichier Manifest déclarant toutes les dépendances d'une archive JAR jarlib-resolve Place le chemin d'une archive JAR dans une propriété spécifiée aprés validation - Des tâches de logging :
Tâche Description record Enregistre-les évenements survenus lors d'un build - Des tâches d'emailing : À noter que la tâche mimemail est dépréciée :
Tâche Description mail Envoie un email par SMTP - Des tâches DotNet :
Tâche Description csc Compile du code C# vbc Compile du code VB.NET jsharpc Compile du code J# ildasm Désassemble du code et des librairies .NET ilasm Assemble des fichiers .il wsdltodotnet Génère du code C# ou VB.NET à partir de fichier WSDL importtypelib Importe une librairie COM vers .NET - Des tâches de préprocessing :
Tâche Description antlr Invoque ANTLR sur une grammaire antstructure Génère une DTD correspondante au fichier de construction icontract Utilise IContract sur ces classes Java import Importe un autre fichier de construction au sein d'un projet javacc Invoque JavaCC sur une grammaire javah Génère des entêtes JNI à partir d'une classe Java jjdoc Invoque JJDoc pour JavaCC jjtree Invoque JJTree pour JavaCC macrodef Définit une nouvelle tâche comme template mparse Invoque MParse sur une grammaire nativetoascii Convertit des fichier natifs en ASCII presetdef Génère une définition basée sur la définition courante translate Identifie des tokens dans un fichier pour les remplacer par celles définies dans un fichier tiers xslt/style Gère un ensemble de documents via XSLT - Des tâches propriété :
Tâche Description available Instancie une propriété si une ressource est disponible basename Détermine le nom d'un fichier spécifié buildnumber Comptabilise le nombre de builds condition Pose une propriété si la condition est applicable dirname Retourne le répertoire où est contenu un fichier spécifié echoproperties Liste les propriétés courantes loadfile Charge un fichier texte au sein d'une propriété loadproperties Charge un fichier en tant que propriétés d'un projet Ant pathconvert Convertie un path vers une OS spécifique property Spécifie les propriétés d'un projet propertyfile Crée ou modifie un fichier de propriétés uptodate Change une propriété si un fichier cible est plus récent qu'un ensemble de sources whichresource Trouve une classe ou une ressource dans le Classpath xmlproperty Charge des propriétés à partir d'un fichier XML - Des tâches réseau :
Tâche Description ftp Implémente un client FTP capable d'envoyer, recevoir, lister ou effacer des fichiers ainsi que de créer des répertoires rexec Automatise une session Rexec scp Copie des fichiers au travers du protocole SSH setproxy Instancie des propriétés Java's web proxy sshexec Exécute une commande distante au travers de SSH telnet Automatise une session Telnet - Des tâches SCM :
Tâche Description cvs Permet la gestion des packages à partir de CVS cvschangelog Génère un fichier XML des changes logs d'un dépôt CVS cvsversion Récupère les versions d'un serveur et d'un client CVS cvspass Ajoute des entrées dans le fichier .cvspass cvstagfile Génère un fichier XML sur les différences entre deux TAGs dans le dépôt CVS clearcase Permet d'exécuter les commandes checkin, checkout, uncheckout, update, lock, unlock, mklbtype, rmtype, mklabel, mkattr, mkdir, mkelem, et mkbl (Détails) continuus/synergy Permet d'exécuter les commandes ccmcheckin, ccmcheckout, ccmcheckintask, ccmreconfigure, et ccmcreateTask (Détails) microsoft Visual Sourcesafe Permet d'exécuter les commandes vssget, vsslabel, vsshistory, vsscheckin, vsscheckout, vssadd, vsscp, et vsscreate (Détails) perforce Permet d'exécuter les commandes p4sync, p4change, p4edit, p4submit, p4have, p4label, p4counter, p4reopen, p4revert, et p4add (Détails) pvcs Permet à un utilisateur d'extraire les dernières sources d'un répertoire PVCS sourceoffsite Permet d'exécuter les commandes sosget, soslabel, soscheckin, et soscheckout (Détails) starteam Permet d'exécuter les commandes stcheckout, stcheckin, stlabel, et stlist (Détails) - Des tâches test :
Tâche Description junit Lance des tests à partir du framework JUnit (Infos produit) junitreport Fusionne différents fichiers XML établis par JUnit pour créer un rapport test Exécute un test unitaire au sein du framezork org.apache.testlet - Des tâches diverses :
Tâche | Description |
defaultexclude | Altère la cible par défaut en excluant certaines règles |
echo | Retourne un message vers le logger (par défaut la console) |
fail | Quitte Ant |
genkey | Génère une clé par l'intermédiaire de KeyStore |
input | Autorise les interactions utilisateur pendant le build |
script | Exécute un script Apache BSF |
sound | Joue un fichier son au terme d'un "build" |
splash | Affiche un "Splash Screen" |
sql | Lance une série de requêtes SQL par le biais de JDBC |
taskdef | Définit une tâche dans le projet courant |
tstamp | Établit les propriétés DSTAMP, TSTAMP et TODAY d'un projet |
typedef | Affecte la définition d'une tâche ou d'une propriété à un projet |
xmlvalidate | Vérifie la grammaire d'un fichier XML |
II-F. PATH & CLASSPATH▲
Bien que ce ne soit pas trés lisible, nous pouvons spécifier les Paths et Classpaths en utilisant « : » ou « ; » comme séparateurs.
<pathelement path="/path/to/file2.jar:/path/to/class2;/path/to/class3" />
Ant convertira directement ces derniers vers le système approprié.
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
L'attribut location spécifie un simple fichier ou un répertoire relatif à celui de base d'un projet. De plus :
<classpath>
<pathelement path="${classpath}"/>
</classpath>
Peut-être abrégé ainsi :
<classpath path="${classpath}">
Si nous souhaitons utiliser plusieurs fois le même chemin comme attribut, nous pouvons référencer le chemin comme suit. Par emploi de fileset, il devient ainsi possible d'inclure ou d'exclure un ensemble de fichiers des Path/Classpath.
<path id="base.path"/>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
Le raccourci précédemment mentionné pour <classpath> est aussi valide pour <path>. Par exemple :
<path id="base.path">
<pathelement path="${classpath}"/>
</path>
Peut-être écrit :
<path id="base.path" path="${classpath}">
III. DÉMARRAGE▲
Démarrer Ant est simple. Une fois installé, tapez juste ant [options] [cible [cible2 … ]] dans une invite de commande. Lorsque rien n'est spécifié, Ant cherche un fichier build.xml dans le répertoire courant. S' il le trouve, il l'utilise comme un fichier de construction. Si vous utilisez l'option -find, Ant cherchera un fichier de construction dans les répertoires parents. Pour permettre à Ant d'utiliser un autre fichier, utilisez la commande ant -buildfile file, où file est le fichier que vous souhaitez utiliser.
Parmi les nombreuses options, retenez les deux suivantes pour votre tranquilité : -quiet, qui ordonne à Ant d'afficher moins d'informations sur la console lorsqu'il tourne et -verbose, réciproque de la première.
Il est aussi possible de spécifier une ou plusieurs cibles qui pourront être exécutées. L'option -projecthelp affiche la description du projet, si elle existe, correspondant à la liste des cibles du projet.
Options | Description |
-help, -h | Affiche les options de la ligne de commande |
-projecthelp, -p | Affiche l'ensemble des cibles du projet |
-version | Affiche la version courante et quitte Ant |
-diagnostics | Affiche les informations pouvant aider à reporter un problème |
-quiet, -q | Affiche le minimum d'informations |
-verbose, -v | Affiche le maximum d'informations |
-debug, -d | Affiche les informations de débogage |
-emacs, -e | Affiche des informations de log pouvant être interprétées |
-lib | Spécifie un chemin où sont situées des librairies externes |
-logfile , -l | Spécifie un fichier de logs de sortie |
-logger | Spécifie la classe devant exécuter le logging |
-listener | Ajoute une instance de classe comme listener |
-noinput | Interdit les entrées interactives |
-buildfile , -file , -f | Spécifie le fichier de construction |
-D<property>=<value> | Spécifie une valeur pour un paramètre donné |
-keep-going, -k | Exécute toutes les cibles indépendantes de celles ayant échoué |
-propertyfile | Charge toutes les propriétés dans un fichier |
-inputhandler | Spécifie la classe qui jouera le rôle de Handler |
-find , -s | Cherche le fichier de construction spécifié jusqu'à la racine système puis l'exécute |
-nice number | Affecte une valeur au Thread principal, 5 étant celle par défaut |
-nouserlib | Lance Ant sans qu'il puisse faire appel aux librairies par défaut |
-noclasspath | Lance Ant sans aucun classpath |
- Listeners : En implémentant l'interface org.apache.tools.antBuildListener, Ant est capable de traiter des évenements liés au démarrage et à la terminaison d'une tâche, d'une cible ou du projet ou survenus lors du log d'un message ;
- Loggers : Ces derniers étendent les capacités d'un listener en écoutant les sorties standard et d'erreur standard ;
- InputHandlers : En implémentant l'interface org.apache.tools.ant.input.InputHandler, Ant est capable de lancer une requête à destination de l'utilisateur afin d'integrer sa réponse dans son comportement.
Pour plus d'informations : Running Ant.
Plusieurs tâches prennent en compte des arguments pouvant être passés en ligne de commande. Pour rendre plus simple le fait de spécifier des arguments, utilisez arg.
Attributs | Description |
value | l'argument d'une simple ligne de commande |
line | une liste d'arguments d'une ligne de commande |
file | le nom d'un fichier, argument d'une simple ligne de commande |
path | un chemin à utiliser |
Impératif |
Il est indispensable de déclarer exactement l'un d'eux |
IV. CONCLUSION▲
Cette seconde partie est basée essentiellement sur la documentation proposée par Apache sur son site officiel. Elle ne prend en compte que le minimum requis pour une compréhension élémentaire de l'outil. Elle s'adresse a un public francophone souhaitant une prise en main rapide. Ce dernier pourra ainsi, aprés quelques heures, bâtir ses propres applications Java par le biais de scripts Ant. Il devra cependant garder à l'esprit les règles suivantes :
- Placer le fichier de constuction principal (build.xml) dans le répertoire principal du projet ;
- Ne jamais mettre de référence vers les fichiers systèmes (Windows C: etc) dans le fichier de construction ;
- Toujours fournir un ensemble de cibles par défaut : init, build, install et clean ;
- La cible de nettoyage doit effacer tous les fichiers générés ;
- Utiliser la balise <description> pour commenter le code XML ;
- Ne jamais hésiter à répartir les différentes cibles dans différents fichiers.
Ant est devenu l'un des fondamentaux du monde Java. Il s'avère donc important de connaître et de comprendre cet outil. Nous pourrons ainsi apprécier dans une prochaine partie, la meilleure manière de concevoir ses propres tâches. D'ici là, je vous invite à parcourir les différentes ressources qu'offre Développez.com (ex., Comment déboguer un script Ant sous NetBeans ? de Vincent Brabant).
V. REMERCIEMENTS▲
Je tiens à remercier l'ensemble de l'équipe de Developpez.com pour ses suggestions et plus particulièrement Pierre Rodriguez et Vincent Brabant pour leur relecture.