Apache Ant. Didier DONSEZ. Université Joseph Fourier PolyTech Grenoble LIG/ADELE. http://membres-liglab.imag.fr/donsez/cours



Documents pareils
Votre premier projet Android

Les architectures 3-tiers Partie I : les applications WEB

INFO-F-404 : Techniques avancées de systèmes d exploitation

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Cedric Dumoulin (C) The Java EE 7 Tutorial

Environnements de développement (intégrés)

TP1. Outils Java Eléments de correction

Création d un service web avec NetBeans 5.5 et SJAS 9

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

WEB page builder and server for SCADA applications usable from a WEB navigator

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

7 Développement d une application de MapReduce

Tutoriel d installation de Hibernate avec Eclipse

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

DOCUMENTATION MODULE BLOCKCATEGORIESCUSTOM Module crée par Prestacrea - Version : 2.0

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Ocs Inventory et GLPI s appuie sur un serveur LAMP. Je vais donc commencer par installer les paquets nécessaires.

JOnAS Day 5.1. Outils de développements

Configurer la supervision pour une base MS SQL Server Viadéis Services

Alfstore workflow framework Spécification technique

Construction et déploiement d applications Java avec Maven, Archiva, Groovy et Jenkins

Notes de cours Practical BigData

VoD ( Video on Demand ) avec VLC

Remote Method Invocation Les classes implémentant Serializable

Jean-Michel Richer L3 Pro Informatique

as Architecture des Systèmes d Information

APIs de table pour SQL Server

Architecture Orientée Service, JSON et API REST

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

titre : CENTOS_CUPS_install&config Système : CentOs 5.7 Technologie : Cups Auteur : Charles-Alban BENEZECH

Testez votre installation. Créer un répertoire vide

Environnements de développement (intégrés)

Déploiement d OCS 1.02 RC2 sous Debian Etch 64

TP1 : Initiation à Java et Eclipse

sshgate Patrick Guiran Chef de projet support

Web Tier : déploiement de servlets

Pharmed. gestion de pharmacie hospitalière. Installation / déploiement

Initiation à JAVA et à la programmation objet.

HAUTE DISPONIBILITÉ DE MACHINE VIRTUELLE AVEC HYPER-V 2012 R2 PARTIE CONFIGURATION OPENVPN SUR PFSENSE

1 Configuration des Fichiers Hosts, Hostname, Resolv.conf

INGÉNIEUR LOGICIEL JAVAEE / GROOVY 8 ANS D EXPÉRIENCE

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

La base de données XML exist. A. Belaïd

4. SERVICES WEB REST 46

OpenPaaS Le réseau social d'entreprise

Projet Java EE Approfondi

TD/TP 1 Introduction au SDK d Android

Création d une application JEE

Programmer en JAVA. par Tama

DOCUMENTATION - FRANCAIS... 2

Europa. Développement JEE 5. avec Eclipse. K a r i m D j a a f a r. A v e c l a c o n t r i b u t i o n d e O l i v i e r S a l v a t o r i

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

IceWarp serveur sur Linux : Guide d'installation

Construire des plug-ins pour SAS Management Console SAS 9.1

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

D E S C R I P T I O N D E S É L É M E N T S C L E F S D ' U I M A

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Instructions Mozilla Thunderbird Page 1

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

1. Formation F5 - Local Traffic Manager Configuring (LTM)

WiFi Security Camera Quick Start Guide. Guide de départ rapide Caméra de surveillance Wi-Fi (P5)

3 Octobre Les Communautés MS

FOSS Enterprise Integration Plattaform

VTP. LAN Switching and Wireless Chapitre 4

Jahia. Guillaume Monnette École Ingénieurs 2000 Marne-La-Vallée IR3

TechSoftware Présentations

Présentation de Java. Olivier de Pertat IT GROUP

SERVEUR DÉDIÉ DOCUMENTATION

Plan. Department of Informatics

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

DOCUMENTATION - FRANCAIS... 2

Intégration d'applications à "gros grain" Unité d'intégration : le "service" (interface + contrat)

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

Rapport de Mini-Projet en ArcGIS Engine

Introduction...3. Objectif...3. Manipulations...3. La Sauvegarde...4. Les différents types...4. Planification...4. Les outils...5

HOWTO INSTALLATION DB2 et NSE (sous RedHat)

What s New. Sun ONE Application Server. Version 7, Enterprise Edition

Installation UpdatEngine serveur (CentOs apache2 / MySQL)

Procédure d installation Trixbox - A2Billing

Once the installation is complete, you can delete the temporary Zip files..

SSH, le shell sécurisé

Java Licence professionnelle CISII,

Java Licence Professionnelle CISII,

MANUEL D INSTALLATION de GEONETWORK sur un serveur LINUX CentOS 4

Contents Windows

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours Linux. Cours en ligne Administrateur Systèmes Linux. Académie Libre

Vanilla : Virtual Box

Projet de programmation (IK3) : TP n 1 Correction

Java Aspect Components (JAC)

Transcription:

http://membres-liglab.imag.fr/donsez/cours Apache Ant Didier DONSEZ Université Joseph Fourier PolyTech Grenoble LIG/ADELE Didier.Donsez@imag.fr, Didier.Donsez@ieee.org

Licence Cette présentation est couverte par le contrat Creative Commons By NC ND http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ 2

Au sommaire Motivation Installation Structure d un projet ANT Principales tâches Développement d une tache Bibliographie et Webographie 3

ANT Séquenceur de travaux Graphe de dépendance de «cibles» Remplaçant de make Un des projets Jakarta/Apache Ecrit en Java Licence Open Source Integré à de nombreux IDE java Jbuilder, NetBeans Forte for Java, VisualAge for Java, Eclipse, Jedit, 4

Points forts versus Points faibles Points forts Portable (path, séparateurs, commandes Unix et Win32) Rapide (une seule VM utilisée) Très nombreuses taches déjà implémentées Largement répandu et intégré aux IDE (Eclipse, ) Syntaxe rigoureuse d XML (document bien formé) Points faibles Verbeux (XML oblige) Pas de DTD! Pas de lancement de «tâches» interactives!! Dépendance de tâches (non temporelles) Java-Centric tout de même!! Bien que http://nant.sourceforge.net/ 5

Installation Télécharger la distribution binaire http://ant.apache.org Dézipper dans un répertoire Positionner les variables d environnement set JAVA_HOME=c:\j2sdk1.x.y set ANT_HOME=c:\apache-ant-1.z.w set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin Ajouter des bibliothèques pour les taches dépendantes Dans %ANT_HOME%\lib Évites d être ennuyer par des VM «parasites» Exemple: netcomponents.jar (www.savarese.org/oro/downloads) pour les taches <ftp> and <telnet> 6

Build.xml Définit l enchainement à suivre pour la construction d un projet Un projet comporte des cibles (target) Correspondant à des activités telles que la compilation, l installation, l exécution, Chaque cible est composée de tâches (task) exécutées en séquence (voir en //) quand la cible est exécutée dépendance avec d autres cibles Ces cibles sont exécutées au préalable Tâche ANT Correspondent à des commandes usuelles (javac, jar, copy, ) Ecrites en Java et portable quelque soit le SE Built-in (fournis avec la distribution ANT) / Proprietaire 7

Structure build.xml <project> <?xml version="1.0" encoding="utf-8"?> <project basedir="." default="compile" name=" Typical ANT Build "> <!-- [définitions de property] --> <!--[définitions de path et patternset ] --> <!--[définitions de target ] --> </project> 8

Structure build.xml <property> <?xml version="1.0" encoding="utf-8"?> <project basedir="." default="compile" name=" Typical ANT Build "> <!-- [définitions de property ] --> <property name="src.dir" value="./src"/> <property name="build.dir" value="./build"/> <property name="doc.dir" value="./doc"/> <property name="apidoc.dir" value="${doc.dir}/api"/> <property file="project.properties"/> <property environment="env"/> <property name="lib.dir" value="${env.libdir}"/> <!-- [définitions de path et patternset ] --> <!-- [définitions de target ] --> </project> 9

Structure build.xml <path> <?xml version="1.0" encoding="utf-8"?> <project basedir="." default="compile" name=" Typical ANT Build "> <!-- [définitions de property ] --> <!-- [définitions de path et patternset ] --> <path id="project.classpath"> <pathelement path="${build.dir}"/> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </path> <!-- [définitions de target ] --> </project> 10

Structure build.xml <target> <?xml version="1.0" encoding="utf-8"?> <project basedir="." default="compile" name=" Typical ANT Build "> <!-- [définitions de property ] --> <!-- [définitions de path et patternset ] --> <!-- [définitions de target ] --> <target name="init"> <mkdir dir="${build.dir}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src.dir}" destdir="${build.dir} classpathref="project.classpath"/> </target> </project> 11

Lancement ant [options] [target [target2 [target3]...]] Options: -help print this message -projecthelp print project help information -buildfile <file> use given build file (-file, -f) -find [<file>] search for build.xml, or file, towards the root of the filesystem -D<property>=<value> use value for given property -propertyfile <file> load all properties from file (with -D taking precedence) -version print the version information and exit -quiet be extra quiet (-q) -verbose be extra verbose -debug print debugging information -emacs produce logging information without adornments -logfile <file> write logging output to given file (-l) -logger <classname> the class that is to perform logging -listener <classname> add an instance of classname as a project listener -inputhandler <class> the class that will handle input requests 12

Exemples de lancement ant ant clean ant f build4jonas322.xml ant Dpassword=toto ant -listener org.apache.tools.ant.xmllogger 13

Exemple de sortie Z:\dev\proj1>ant compile Buildfile: build.xml init: [mkdir] Created dir: Z:\dev\proj1\build compile: [javac] Compiling 2 source files to Z:\dev\proj1\build [javac] Z:\dev\proj1\src\hello\Hello.java:44: cannot resolve symbol [javac] symbol : method length () [javac] location: class java.lang.string[] [javac] int len = argv.length(); [javac] ^ [javac] 1 error BUILD FAILED file:z:/dev/proj1/build.xml:49: Compile failed; see the compiler error output for details. Total time: 6 seconds 14

Ordre d exécution des cibles Exécution une et une seule fois de A puis B puis C puis D (si ant D) <target name="a"/> <target name="b" depends="a"/> <target name="c" depends="b"/> <target name="d" depends="c,b,a"/> Condition d exécution if/unless <target name="build.windows" if="os.is.windows"/> <target name="build.no.windows" unless="os.is.windows"/> 15

Built-in Les tâches Optional Requière des bibliothèques Java supplémentaires ou des outils externes (csc, vss, ) Peuvent être disponible que sur une plate-forme particulière Propriétaire Ajoute pour les besoins du projet (jcrmic, apdutool ) 16

Quelques tâches (i) Chargement de propriétés LoadFile, LoadProperties, XmlProperty, EchoProperties Interaction utilisateur Echo, Input, Sound, Splash Structures de contrôle Condition, Available, Parallel, Sequential, Waitfor, Sleep, Fail, Ant, Antcall, MacroDef, Script (JavaScript, PerlScript, VBScript, Jython, ) Pas de boucle! Compilation/Génération Javac, Javah, Rmic, Style, EjbJar, Jspc, ANTLR, JavaCC,.NET (csc, vbc, jsharp,ilasm, Ildasm, WsdlToDotnet,), Patch Source code management CVS, VSS, ClearCase, Perforce 17

Test Quelques tâches (ii) Junit, Cactus (formally J2EEUnit) Documentation Javadoc, JUnit reporting, Mail / MimeMail, Stylebook, Package (Emballage) Jar, Manifest, SignJar, GenKey, War, Ear, Zip, BZip2, War, Tar, Cab, Rpm Exécution Java, Exec, SQL Déploiement Copy, Move, Chmod, Mkdir, Attrib Unwar, unzip, unjar, untar, Checksum FTP, Telnet, Get, Scp, Sshexec 18

Quelques tâches (iii) Web Image 19

Quelques tâches (iv) La liste à jour http://ant.apache.org/manual/tasksoverview.html Il en existe des centaines d autres en dehors de la distribution Apache Recensées http://ant.apache.org/external.html Ou non AspectJ, J2ME, ProGuard, CheckStyle, Jmetra, Java2HTML, Doxygen http://ant-contrib.sourceforge.net repeat, apdutool, jcrmic, javanccs, javasrc, webdav AXIS tasks (wsdl2java, java2wsdl, admin) APACHE jmeter Remote ANT http://sourceforge.net/projects/remoteant/ exécute un projet sur un site distant (par SOAP) 20

Quelques tâches (v) http://ant-contrib.sourceforge.net Logic Tasks AntCallBack AntFetch Assert Foreach For If Outoutdate RunTarget Switch hrow TimestampSelector Trycatch Network Tasks HTTP Post, AntServer / RemoteAnt Performance Monitoring and Tasks Performance Monitor Stopwatch Platform Tasks Osfamily Shellscript Property Tasks Math Propertycopy PropertySelector Pathtofileset PropertyRegex SortList URLEncode Variable Process Tasks Forget Limit Other Tasks antclipse CompileWithWalls IniFile VerifyDesign 21

Exemples d exécution Java <java classname="hello.hello"/> <arg line="didier jean-marie ioannis"/> </java> <java classname="hello.hello" fork="true" maxmemory="128m"> <sysproperty key="debug" value="true"/> <arg value="didier"/> <arg value="jean-marie"/> <arg value="ioannis"/> <jvmarg value="-xrunhprof:cpu=samples,file=log.txt,depth=3"/> <classpath> <pathelement location="hello.jar"/> <pathelement path="${java.class.path}"/> </classpath> </java> 22

Exemples d initialisation avec vérification des propriétés <target name="init"> <available property="server.ok" classname="com.mycomp.server.httpdserver" classpath="${server.classpath}"/> <available property="setup.done" file="${server.conf.dir}/conf/server.xml"/> </target> <target name="check server" unless="server.ok"> <fail message="${line.separator}configure the server classpath."/> </target> <target name="check setup" unless="setup.ok"> <fail message="${line.separator}setup your server.xml configuration file."/> </target> <target name="run" depends="init, check server, check setup">... </target> 23

Exemple de structure de contrôle <target name="confirm.deletion"> <input message="all data is going to be deleted (y/n)?" validargs="y,n" addproperty="do.delete" /> <condition property="do.abort"> <equals arg1="n" arg2="${do.delete}" /> </condition> <fail if="do.abort">build aborted by user.</fail> </target> 24

Exemple de InputHandler InputHandler Abstrait les entrées et sorties Exemple import org.apache.tools.ant.input.*;... project.setinputhandler( new PropertyFileInputHandler()); DefaultInputHandler System.out et System.in PropertyFileInputHandler prompt as a key to look up a value in the property file. The name of the file is read from the ant.input.properties system property. 25

Exemple de structure de contrôle <target name="default"> <antcall target="dosomethingelse"> <param name="param1" value="value"/> </antcall> </target> <target name="dosomethingelse"> <echo message="param1=${param1}"/> </target> 26

Exemple avec SQL http://ant.apache.org/manual/coretasks/sql.html Envoi de requêtes SQL à un SGBD via JDBC Exemple <sql driver="org.hsqldb.jdbcdriver" url="jdbc:hsqldb:file:${database.dir}" userid="${dbadmin.username}" password="${dbadmin.password}" expandproperties="true" > <transaction> CREATE USER ${newuser} PASSWORD ${newpassword} </transaction> <transaction src="create.sql"/> </sql> 27

Exemple avec JMX (org.apache.catalina.ant.jmx) <property name="jmx.serviceurl" value="service:jmx:rmi:///jndi/rmi://localhost:9999/server"/> <jmx:open url="${jmx.serviceurl}" username="${jmx.username}" password="${jmx.password}" ref="my.jmx.server"/> <jmx:query ref="my.jmx.server" name="*:*" resultproperty="mbeans" attributebinding="false"/> <echo message="number of MBeans in server ${jmx.serviceurl} is ${mbeans.length}"/> <echoproperties prefix="mbeans."/> <jmx:set ref="my.jmx.server" name="java.lang:type=threading" echo="true"> <attribute name="threadcontentionmonitoringenabled" value="true" type="boolean"/> <attribute name="threadcputimeenabled" value="false" type="boolean"/> </jmx:set> 28

Exemple avec FTP <project name="mon Site Web Perso" default="transfert" basedir="."> <property name="src.dir" value="."/> <property name="remote.dir" value="/public_html"/> <target name="init"> <tstamp><format property="today" pattern="yymmdd"/></tstamp> <echo file="${src.dir}/last_site_loading">${today}</echo> <input message="please enter username:" addproperty="userid"/> <input message="please enter password:" addproperty="password"/> </target> <target name="transfert" depends="init,help"> <ftp server="ftp.monhebergeur.fr" remotedir="${remote.dir}" userid="${userid}" password="${password}" depends="yes" binary="yes"> <fileset dir="${src.dir}"/> </ftp> <mail from="me" tolist="you" subject="results of transfer" files="build.log" /> </target> </project> 29

Exemple avec apply Exécute une commande du système <apply executable="cc" dest="src/c" parallel="false"> <arg value="-c"/> <arg value="-o"/> <targetfile/> <srcfile/> <fileset dir="src/c" includes="*.c"/> <mapper type="glob" from="*.c" to="*.o"/> </apply> 30

Exemple avec MacroDef <macrodef name="call-cc"> <attribute name="target"/> <attribute name="link"/> <attribute name="target.dir"/> <element name="cc-elements"/> <sequential> <mkdir dir="${obj.dir}/${target}"/> <mkdir dir="${target.dir}"/> <cc link="${link}" objdir="${obj.dir}/${target}" outfile="${target.dir}/${target}"> <compiler refid="compiler.options"/> <cc-elements/> </cc> </sequential> </macrodef> <call-cc target="unittests" link="executable" target.dir="${build.bin.dir}"> <cc-elements> <includepath location="${gen.dir}"/> <includepath location="test"/> <fileset dir="test/unittest" includes = "**/*.cpp"/> <fileset dir="${gen.dir}" includes = "*.cpp"/> <linker refid="linker-libs"/> </cc-elements> </call-cc> 31

Exemple avec Script <project name="squares" default="main" basedir="."> <target name="setup"> <script language="javascript"> <![CDATA[ for (i=1; i<=10; i++) { echo=squares.createtask("echo"); main.addtask(echo); echo.setmessage(i*i); } ]]> </script> </target> <target name="main" depends="setup"/> </project> generates setup: main: 1 4 9 16 25 36 49 64 81 100 BUILD SUCCESSFUL 32

Portabilité Utilisez les Path et PathElement Éviter la forme <classpath>z:\lib\my.jar;.\classes</classpath> Pathconvert Convertit les Path vers une chaîne en fonction d un SE Utile à la création de scripts (.bat,.sh) ou dans les tâches <exec> Exemple <pathconvert targetos="unix" property="project.classpath.unix" refid="project.classpath"> <map from="${env.home}" to="/usr/local"/> </pathconvert> <echo file="run.sh" append="false" >#\!/bin/sh java -classpath ${project.classpath.unix} hello.hellointeractive </echo> 33

Complément sur les FileSets (i) PatternSet Inclut/Exclut des fichiers d un FileSet <fileset dir="${server.src}" casesensitive="yes" > <include name="**/*.java"/> <exclude name="**/*test*"/> </fileset> <fileset dir="${server.src}" casesensitive="yes" > <patternset id="non.test.sources" > <include name="**/*.java"/> <exclude name="**/*test*"/> </patternset> </fileset> <fileset dir="${client.src}" > <patternset refid="non.test.sources"/> </fileset> 34

Mapper Complément sur les FileSets (ii) changement de noms lors des copies, déplacements, <mapper type="flatten"/> A.java -> A.java foo/bar/b.java -> B.java <mapper type="merge" to="archive.tar"/> A.java -> archive.tar foo/bar/b.java -> archive.tar <mapper type="glob" from="*.java" to="*.java.bak"/> A.java -> A.java.bak foo/bar/b.java -> foo/bar/b.java.bak <mapper type="regexp" from="^(.*)/([^/]+)/([^/]*)$$" to="\1/\2/\2-\3"/> A.java ignored foo/bar/b.java -> foo/bar/bar-b.java 35

Selector Complément sur les FileSets (iii) Sélectionne les fichiers sur leurs noms, contenu, propriétés <project default="default" basedir="."> <selector id="doctozip"> <and> <size value="4" units="ki" when="more"/> <date datetime="01/01/2003 12:00 AM" when="after"/> <or> <depth max="0"/> <filename name="*.html"/> <filename name="*.xml"/> </or> <majority> <contains text="génie logiciel" casesensitive="false"/> <contains text="jakarta ANT" casesensitive="true"/> </majority> </and> </selector> <target name="default"> <zip destfile="manual.zip" ><fileset dir="./docs"> <selector refid="doctozip"/> </fileset></zip> </target> </project> Remarque: il est possible de définir des selectors custom 36

FilterChains et FilterReaders (i) Permet d enchaîner des filtres sur les contenus échangés lors des taches Copy, LoadFile, LoadProperties, Move Exemple <copy file="${src.file}" tofile="${dest.file}"> <filterchain> <filterchain> <filterreader classname="org.apache.tools.ant.filters.headfilter"> <param name="lines" value="15"/> </filterreader> <filterreader classname="org.apache.tools.ant.filters.linecontains"> <param type="contains" value="main"/> </filterreader> </filterchain> </copy> Est équivalent à la commande Unix cat < ${src.file} head -n15 grep main > ${dest.file} 38

FilterChains et FilterReaders (ii) FilterReaders fournis dans la distribution API ClassConstants, ExpandProperties, HeadFilter, LineContains, LineContainsRegExp, PrefixLines, ReplaceTokens, StripJavaComments, StripLineBreaks, StripLineComments, TabsToSpaces, TailFilter, interface org.apache.tools.ant.filters.chainablereader classe org.apache.tools.ant.filters.baseparamfilterreader Exercice : CPPFilterReader réalise la substitution de macros et inclusion de fichiers comme le fait CPP 39

Listeners Reçoit des événements durant la construction Build started / finished Target started / finished Task started / finished Message logged Built-in: log4j et XML Exemple ant -listener org.apache.tools.ant.xmllogger Il existe des «feuilles» XSLT pour formatter le journal produit! 40

Création de tâches ANT personnalisées La classe doit étendre org.apache.tools.ant.task méthode execute() lève BuildException si besoin comporter un setter pour chaque attribut (setmessage(string msg)) manipuler les éléments imbriqués (texte, FileSet, ) La déclaration <?xml version="1.0"?> <project name="myecho" default="main" basedir="."> <taskdef name="myecho" classname="fr.imag.adele.ant.task.myechotask" classpath="./myechotask.jar"/> <target name="main"> <myecho message="hello World!"/> <myecho>my echo task works</myecho> </target> </project> 41

Création de tâches ANT personnalisées package fr.imag.adele.ant.task; import org.apache.tools.ant.buildexception; import org.apache.tools.ant.task; public class MyEchoTask extends Task { private String msg; private String text; public void execute() throws BuildException { if(msg!=null) System.out.println(msg); if(text!=null) System.out.println(text); } public void setmessage(string msg) { this.msg = msg; } public void addtext(string text){ this.text=text; } } 42

Ant depuis Java Motivation : réutilisation des tâches Ant dans des programmes Java Exemple public class Unzip { public static void main (String[] args) { if(args.length==1) { new Unzip().unzip(args[0],"."); } else if(args.length==2) { new Unzip().unzip(args[0],args[1]); } else {... } } final class Expander extends org.apache.tools.ant.taskdefs.expand { public Expander() { project = new Project(); project.init(); tasktype = "unzip"; taskname = "unzip"; target = new Target(); } } protected void unzip(string zipfilepath, String destinationdir) { Expand expand = new Expander(); expand.setsrc(new File(zipFilepath)); expand.setdest(new File(destinationDir)); expand.execute(); } } 43

Apache Ivy http://ant.apache.org/ivy Tool for managing (recording, tracking, resolving and reporting) project dependencies. not tied to any methodology or structure. configurability to be adapted to a broad range of dependency management and build processes. tight integration with Apache Ant Ant tasks ranging from dependency resolution to dependency reporting and publication. transitive dependencies management configured to use a lot of different repositories 44

Apache Ivy http://ant.apache.org/ivy Exemple de module <ivy-module version="2.0"> <info organisation="apache" module="hello-ivy"/> <dependencies> <dependency org="commons-lang" name="commons-lang" rev="2.0"/> <dependency org="commons-cli" name="commons-cli" rev="1.0"/> </dependencies> </ivy-module> 45

Buildr http://incubator.apache.org/buildr/ 46

Gant http://gant.codehaus.org/ Tool for scripting Ant tasks using Groovy instead of XML to specify a build Example includetargets << gant.targets.clean cleanpattern << [ '**/*~', '**/*.bak' ] cleandirectory << 'build' target ( stuff : 'A target to do some stuff.' ) { println ( 'Stuff' ) depends ( clean ) echo ( message : 'A default message from Ant.' ) otherstuff ( ) } target ( otherstuff : 'A target to do some other stuff' ) { println ( 'OtherStuff' ) echo ( message : 'Another message from Ant.' ) clean ( ) } setdefaulttarget ( stuff ) Run the build gant -p Gant Dfoo=bar f build.groovy Misc ant2gant, gant ant task, ivy (dependencies management), execute (shell commands and pipe) 47

NAnt (http://nant.sourceforge.net/) Un portage de ANT (canevas + taches) sur.net (et Mono) Taches spécifiques à.net val, asminfo, attrib, available, aximp, call, cl, copy, csc, cvs, cvs-changelog, cvs-checkout, cvsexport, cvs-pass, cvs-rtag, cvs-tag, cvs-update, delay-sign, delete, description, echo, exec, fail, foreach, get, gunzip, if, ifnot, ilasm, ildasm, include, jsc, lib, license, link, loadfile, loadtasks, mail, mc, midl, mkdir, move, nant, nantschema, ndoc, nunit, nunit2, property, rc, readregistry, regasm, regex, regsvcs, resgen, script, servicecontroller, setenv, sleep, solution, style, sysinfo, tar, tlbexp, tlbimp, touch, tstamp, unzip, uptodate, vbc, vjc, xmlpeek, xmlpoke, zip Intégration dans MS Visual Studio et SharpDevelop 48

NAnt : exemple de taches personnalisés using NAnt.Core; using NAnt.Core.Attributes; namespace NAnt.Examples.Tasks { [TaskName("myecho")] public class MyEchoTask : Task { #region Private Instance Fields private string _message; #endregion Private Instance Fields #region Public Instance Properties [TaskAttribute("message", Required=true)] public string Msg { get { return _message; } set { _message = value; } } #endregion Public Instance Properties #region Override implementation of Task protected override void ExecuteTask() { Log(Level.Info, _message); } #endregion Override implementation of Task } } 49

NAnt : exemple de projet <?xml version="1.0"?> <project name="nant" default="run"> <!-- Compile the test task and add it then use it. --> <target name="build"> <mkdir dir="bin" /> <csc target="library" output="bin/mytasks.dll"> <sources> <include name= MyEchoTask.cs"/> </sources> <references basedir="${nant::get-base-directory()}"> <include name="nant.core.dll"/> </references> </csc> </target> <target name="run" depends="build"> <!-- Dynamically load the tasks in the Task assembly. --> <loadtasks assembly="bin/mytasks.dll" /> <!-- Call our new task, converts the message attribute to all caps and displays it. --> <myecho message= Hello World!"/> </target> <target name="clean"> <!-- Delete the build output. --> <delete file="bin/mytasks.dll" if="${file::exists('bin/mytasks.dll')}" /> </target> </project> 50

Alternatives Apache Maven http://membres-liglab.imag.fr/donsez/cours/maven.pdf 7Bee (Build Everything Easier) TODO 51

Web Bibliographie et Webographie http://ant.apache.org http://ant-contrib.sourceforge.net/cc.html http://ant-contrib.sourceforge.net/tasks/tasks/index.html Complément http://www-adele.imag.fr/~donsez/cours/tpant.zip Exemples et exercices http://wwwadele.imag.fr/~donsez/cours/coursjavaoutil.pdf 52

Bibliographie et Webographie Ouvrages Erik Hatcher, Steve Loughran, "Java Development With Ant", Ed Manning Publications Company, Août 2002, 672 pages, ISBN 1930110588 Un des plus détaillés Richard Hightower, Nicholas Lesiecki, «Java Tools for Extreme Programming: Mastering Open Source Tools, including Ant, JUnit, and Cactus», Ed Wiley, ISBN: 0-471-20708-X, November 2001 Eric M. Burke, Brian M. Coyner «Java Extreme Programming Cookbook», Ed O Reilly, March 2003, ISBN: 0-596-00387-0, 288 pages Jesse E. Tilly, Eric M. Burke, Ant: The Definitive Guide, OReilly, http://www.oreilly.com/catalog/anttdg/index.html?cmp=ill- 4GV796923290 Glenn Niemeyer and Jeremy Poteet, Extreme Programming with Ant: Building and Deploying Java Applications with JSP, EJB, XSLT, XDoclet, and Junit, Ed SAMS, October 2003 http://java.sun.com/developer/books/javaprogramming/poteet/ant_ch0 8.pdf 53