I. INTRODUCTION

I-A. Objectif

L'objectif de cet article est de présenter l'outil Ivy et IvyDE.

Ivy est un outil de gestion de dépendances (résolution des dépendances, génération de comptes-rendus des dépendances, publication d'éléments de dépendances). Ivy est intégré avec Ant et fournit les tâches correspondant à ses différentes fonctionnalités. Ivy peut également être exécuté indépendamment d'Ant. Ivy est fortement flexible, configurable et non lié à aucune structure de projet, méthodologie de développement ou processus.

Ivy a été initialement créé par Xavier Hanin en septembre 2004 et diffusé sur le site jayasoft.org. En 2006, Ivy est hébergé par l'incubateur Apache. En 2007, Ivy devient un sous-projet de Ant.

IvyDE est le plugin Eclipse qui intègre la gestion de dépendances d'Ivy.

I-B. Connaissances prérequises

Pour une bonne compréhension de cet article, il est préférable d'avoir quelques connaissances du processus de développement d'une application Java, du principe des dépendances entre bibliothèques et de Maven, ainsi que de l'utilisation d'Ant et d'Eclipse.

I-C. Autres ressources

II. IVY

II-A. Installation

Ivy peut être installé manuellement en copiant le fichier « ivy-2.3.0.jar » contenu dans le fichier « apache-ivy-2.3.0-bin.zip » dans le dossier « lib » de l'installation d'Ant.

Ivy peut également être installé automatiquement dans un projet grâce à script Ant comme celui-ci (lui-même inspiré de ce que l'on peut trouver dans le dossier « src/example/go-ivy » du zip de Ivy)

build.xml
CacherSélectionnez
  1. <project name="exemple-hello-ivy" default="hello-ivy" xmlns:ivy="antlib:org.apache.ivy.ant"> 
  2.  
  3.     <!-- Indique la version de Ivy nécessaire pour le build --> 
  4.     <property name="ivy.install.version" value="2.3.0" /> 
  5.     <!-- Dossier contenant Ivy --> 
  6.     <property name="ivy.jar.dir" value="${basedir}/ivy" /> 
  7.     <!-- Jar d'Ivy --> 
  8.     <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy-${ivy.install.version}.jar" /> 
  9.     <!-- URL du jar d'Ivy sur le repository Maven --> 
  10.     <property name="ivy.jar.url" value="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" /> 
  11.  
  12.     <!-- Paramètres du proxy --> 
  13.     <!-- Nom de la machine proxy --> 
  14.     <property name="proxy.host" value="" /> 
  15.     <!-- Port du proxy --> 
  16.     <property name="proxy.port" value="" /> 
  17.     <!-- Compte pour accéder au proxy --> 
  18.     <property name="proxy.user" value="" /> 
  19.     <!-- Mot de passe pour accéder au proxy --> 
  20.     <property name="proxy.password" value="" /> 
  21.     <!-- Liste d'adresses séparées par une barre verticale | ne nécessitant pas le proxy --> 
  22.     <property name="proxy.ignore" value="" /> 
  23.  
  24.     <property name="build.dir" value="bin" /> 
  25.     <property name="src.dir" value="src" /> 
  26.  
  27.  
  28.  
  29.     <!-- ====================================================================================== 
  30.           Target init.proxy : initialise le proxy 
  31.          ====================================================================================== --> 
  32.     <target name="test-params-proxy-presents"> 
  33.         <condition property="params-proxy-presents"> 
  34.             <not> 
  35.                 <equals arg1="${proxy.host}" arg2=""/> 
  36.             </not> 
  37.         </condition> 
  38.     </target> 
  39.     <target name="init.proxy" depends="test-params-proxy-presents" if="params-proxy-presents"> 
  40.         <setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}" 
  41.                 proxyuser="${proxy.user}" proxypassword="${proxy.password}" 
  42.                 nonproxyhosts="${proxy.ignore}"/> 
  43.     </target> 
  44.  
  45.     <!-- ====================================================================================== 
  46.           Target clean-ivy : supprime l'installation d'Ivy               
  47.          ====================================================================================== --> 
  48.     <target name="clean-ivy" description="Suppression de l'installation d'Ivy"> 
  49.         <echo message="Suppression de l'installation d'Ivy" /> 
  50.         <delete dir="${ivy.jar.dir}" /> 
  51.     </target> 
  52.  
  53.     <!-- ====================================================================================== 
  54.           Target test-ivy-jar-present : teste l'installation d'Ivy 
  55.          ====================================================================================== --> 
  56.     <target name="test-ivy-jar-present"> 
  57.         <available property="ivy-jar-present" file="${ivy.jar.file}"/> 
  58.     </target> 
  59.     <target name="affiche-ivy-jar-present" depends="test-ivy-jar-present" if="ivy-jar-present"> 
  60.         <echo message="Le jar d'Ivy est present"/> 
  61.     </target> 
  62.     <target name="affiche-ivy-jar-pas-present" depends="test-ivy-jar-present" unless="ivy-jar-present"> 
  63.         <echo message="Le jar d'Ivy est absent"/> 
  64.     </target> 
  65.  
  66.     <!-- ====================================================================================== 
  67.           Target test-ivy-http-accessible : teste accessibilite d'Ivy dans le repository Maven 
  68.          ====================================================================================== --> 
  69.     <target name="test-ivy-http-accessible"> 
  70.         <condition property="ivy-http-accessible"> 
  71.             <http url="${ivy.jar.url}"/> 
  72.         </condition> 
  73.     </target> 
  74.     <target name="affiche-ivy-http-accessible" depends="test-ivy-http-accessible" if="ivy-http-accessible"> 
  75.         <echo message="L'URL du jar d'Ivy est accessible"/> 
  76.     </target> 
  77.     <target name="affiche-ivy-http-pas-accessible" depends="test-ivy-http-accessible" unless="ivy-http-accessible"> 
  78.         <echo message="L'URL du jar d'Ivy est inaccessible"/> 
  79.     </target> 
  80.  
  81.     <!-- ====================================================================================== 
  82.           Target download-ivy : télécharge Ivy 
  83.          ====================================================================================== --> 
  84.     <target name="download-ivy"  
  85.             depends="test-ivy-jar-present,affiche-ivy-jar-present,affiche-ivy-jar-pas-present,  
  86.                      test-ivy-http-accessible,affiche-ivy-http-accessible,affiche-ivy-http-pas-accessible"  
  87.             unless="ivy-jar-present" if="ivy-http-accessible" description="Telechargement d'Ivy"> 
  88.  
  89.         <antcall target="clean-ivy"/> 
  90.         <mkdir dir="${ivy.jar.dir}" /> 
  91.         <echo message="Telechargement de la version ${ivy.install.version} d'Ivy depuis le repository Maven" /> 
  92.         <get src="${ivy.jar.url}"  
  93.              dest="${ivy.jar.file}"  
  94.              usetimestamp="true" /> 
  95.     </target> 
  96.  
  97.     <!-- ====================================================================================== 
  98.           Target install-ivy : installe Ivy (vérifie la version de ant et la présence du jar) 
  99.          ====================================================================================== --> 
  100.     <target name="install-ivy" depends="init.proxy,download-ivy" description="Installation d'Ivy"> 
  101.         <fail message="La version de ant est incorrecte (1.6.0 minimum)"> 
  102.             <condition> 
  103.               <not> 
  104.                 <antversion atleast="1.6.0"/> 
  105.               </not> 
  106.             </condition> 
  107.         </fail> 
  108.         <fail message="Le fichier Jar de Ivy est manquant"> 
  109.             <condition> 
  110.                 <not> 
  111.                     <available file="${ivy.jar.file}"/> 
  112.                 </not> 
  113.             </condition> 
  114.         </fail> 
  115.         <path id="ivy.lib.path"> 
  116.             <fileset dir="${ivy.jar.dir}" includes="*.jar" /> 
  117.         </path> 
  118.         <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path" /> 
  119.     </target> 
  120.  
  121.     <!-- ====================================================================================== 
  122.           Target hello-ivy : exemple permettant de valider l'installation d'Ivy 
  123.          ====================================================================================== --> 
  124.     <target name="hello-ivy" depends="install-ivy" description="Exemple d'utilisation d'Ivy"> 
  125.         <!-- Suppression les dossiers d'exemple --> 
  126.         <echo message="Suppression des dossiers d'exemple"/> 
  127.         <delete includeemptydirs="true" quiet="true"> 
  128.             <fileset dir="${src.dir}" /> 
  129.             <fileset dir="${build.dir}" /> 
  130.         </delete> 
  131.  
  132.         <!-- Creation du source Hello.java --> 
  133.         <echo message="Creation du source Hello.java"/> 
  134.         <mkdir dir="${src.dir}/example" /> 
  135.         <echo file="${src.dir}/example/Hello.java"> 
  136. package example; 
  137.  
  138. import org.apache.commons.lang.WordUtils; 
  139.  
  140. public class Hello { 
  141.     public static void main(String[] args) { 
  142.         String  message = "hello ivy !"; 
  143.         System.out.println("standard message : " + message); 
  144.         System.out.println("capitalized by " + WordUtils.class.getName()  
  145.                                 + " : " + WordUtils.capitalizeFully(message)); 
  146.     } 
  147. } 
  148.         </echo> 
  149.  
  150.         <!-- Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6 --> 
  151.         <echo message="Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6"/> 
  152.         <ivy:cachepath organisation="commons-lang" module="commons-lang" revision="2.6"  
  153.                        pathid="lib.path.id" inline="true"/> 
  154.          
  155.         <!-- Compilation --> 
  156.         <echo message="Compilation"/> 
  157.         <mkdir dir="${build.dir}" /> 
  158.         <javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" classpathref="lib.path.id" /> 
  159.          
  160.         <!-- Execution --> 
  161.         <echo message="Execution"/> 
  162.         <java classname="example.Hello"> 
  163.             <classpath> 
  164.                 <path refid="lib.path.id" /> 
  165.                 <path location="${build.dir}" /> 
  166.             </classpath> 
  167.         </java> 
  168.     </target> 
  169. </project> 

En début de script, la propriété « ivy.install.version » correspond à la version d'Ivy à utiliser.

Les propriétés dont le nom commence par « proxy. » correspondent aux paramètres d'utilisation d'un proxy pour accéder à Internet afin de télécharger le jar d'Ivy.

Le jar d'Ivy est téléchargé depuis le repository Maven s'il n'est pas déjà présent dans le dossier « ivy » du projet. Le jar d'Ivy peut être installé manuellement en le déposant dans le dossier « ivy » du projet.

Voici un exemple d'exécution :

 
CacherSélectionnez
  1. D:\workspaceKep\HelloIvy>ant 
  2. Buildfile: D:\workspaceKep\HelloIvy\build.xml 
  3.  
  4. test-params-proxy-presents: 
  5.  
  6. init.proxy: 
  7.  
  8. test-ivy-jar-present: 
  9.  
  10. affiche-ivy-jar-present: 
  11.  
  12. affiche-ivy-jar-pas-present: 
  13.      [echo] Le jar d'Ivy est absent 
  14.  
  15. test-ivy-http-accessible: 
  16.  
  17. affiche-ivy-http-accessible: 
  18.      [echo] L'URL du jar d'Ivy est accessible 
  19.  
  20. affiche-ivy-http-pas-accessible: 
  21.  
  22. download-ivy: 
  23.  
  24. clean-ivy: 
  25.      [echo] Suppression de l'installation d'Ivy 
  26.     [mkdir] Created dir: D:\workspaceKep\HelloIvy\ivy 
  27.      [echo] Telechargement de la version 2.3.0 d'Ivy depuis le repository Maven 
  28.       [get] Getting: http://repo1.maven.org/maven2/org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar 
  29.       [get] To: D:\workspaceKep\HelloIvy\ivy\ivy-2.3.0.jar 
  30.  
  31. install-ivy: 
  32.  
  33. hello-ivy: 
  34.      [echo] Suppression des dossiers d'exemple 
  35.      [echo] Creation du source Hello.java 
  36.     [mkdir] Created dir: D:\workspaceKep\HelloIvy\src\example 
  37.      [echo] Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6 
  38. [ivy:cachepath] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  39. [ivy:cachepath] :: loading settings :: url = jar:file:/D:/workspaceKep/HelloIvy/ivy/ivy-2.3.0.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  40. [ivy:cachepath] :: resolving dependencies :: commons-lang#commons-lang-caller;working 
  41. [ivy:cachepath]         confs: [default, master, compile, provided, runtime, system, sources, javadoc, optional] 
  42. [ivy:cachepath]         found commons-lang#commons-lang;2.6 in public 
  43. [ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ... 
  44. [ivy:cachepath] ............................................. (364kB) 
  45. [ivy:cachepath] .. (0kB) 
  46. [ivy:cachepath]         [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (790ms) 
  47. [ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ... 
  48. [ivy:cachepath] ................................... (277kB) 
  49. [ivy:cachepath] .. (0kB) 
  50. [ivy:cachepath]         [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (650ms) 
  51. [ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ... 
  52. [ivy:cachepath] ........................................................................ 
  53. [ivy:cachepath] .................................... (1585kB) 
  54. [ivy:cachepath] .. (0kB) 
  55. [ivy:cachepath]         [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2580ms) 
  56. [ivy:cachepath] :: resolution report :: resolve 50ms :: artifacts dl 4030ms 
  57.         --------------------------------------------------------------------- 
  58.         |                  |            modules            ||   artifacts   | 
  59.         |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  60.         --------------------------------------------------------------------- 
  61.         |      default     |   1   |   0   |   0   |   0   ||   1   |   1   | 
  62.         |      master      |   1   |   0   |   0   |   0   ||   1   |   1   | 
  63.         |      compile     |   1   |   0   |   0   |   0   ||   0   |   0   | 
  64.         |     provided     |   1   |   0   |   0   |   0   ||   0   |   0   | 
  65.         |      runtime     |   1   |   0   |   0   |   0   ||   0   |   0   | 
  66.         |      system      |   1   |   0   |   0   |   0   ||   0   |   0   | 
  67.         |      sources     |   1   |   0   |   0   |   0   ||   1   |   1   | 
  68.         |      javadoc     |   1   |   0   |   0   |   0   ||   1   |   1   | 
  69.         |     optional     |   1   |   0   |   0   |   0   ||   0   |   0   | 
  70.         --------------------------------------------------------------------- 
  71.      [echo] Compilation 
  72.     [mkdir] Created dir: D:\workspaceKep\HelloIvy\bin 
  73.     [javac] Compiling 1 source file to D:\workspaceKep\HelloIvy\bin 
  74.      [echo] Execution 
  75.      [java] standard message : hello ivy ! 
  76.      [java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy ! 
  77.  
  78. BUILD SUCCESSFUL 
  79. Total time: 10 seconds 
  80.  
  81. D:\workspaceKep\HelloIvy> 

On remarque dans la trace générée que le jar de commons-lang version 2.6 est téléchargé depuis un dépôt public (ainsi que ses sources et sa javadoc).

II-B. Terminologie

Ivy comporte un vocabulaire particulier que voici (la page de documentation originelle : ici) :

Image non disponible
  • Organisation (Organisation) : son sens est très proche du sens de « groupId » pour Maven. L'organisation permet de regrouper la production d'une équipe (il peut s'agir d'une entreprise, d'un groupe de gens ou même d'un seul individu). Exemple : org.apache, com.ibm, fr.inria. ;
  • Module (Module) : est un groupe logiciel réutilisable suivant une gestion de révision. À chacune des révisions d'un module correspondent un descripteur de module et un ou plusieurs artifacts ;
  • Descripteur de module (Module Descriptor) : permet de décrire un module. Il indique les éléments l'identifiant (organisation, nom de module, branch et révision), les artifacts les composants, les configurations possibles et ses dépendances. Avec Ivy, les descripteurs de module sont des fichiers « ivy.xml ». Mais Ivy accepte également les fichiers « pom.xml » de Maven 2 ou éventuellement n'importe quel autre format dont un parser serait implémenté (car il est possible de définir son propre parser de descripteurs de module) ;
  • Artifact (Artifact) : est un fichier unique livrable lors de la publication d'un module. En général, un module comporte peu d'artifacts mais il n'y a pas de limite au nombre et au type d'artifacts déclarés pour un module. Exemple : ant-1.7.0-bin.zip, apache-ant-1.7.0-src.tar.gz ;
  • Type d'artifact (Type of an artifact) : correspond à la catégorie de l'artifact. Il peut s'agir des specifications, de la javadoc, des sources… Ces catégories dépendent des choix de l'organisation développant le module ;
  • Extension du nom de fichier d'un artifact (Artifact file name extension) : est indépendante du type de l'artifact. Par exemple, la javadoc peut être dans un fichier .zip, .jar or .tar.gz par exemple ;
  • Révision d'un module (Module Revision) : correspond à l'état d'un module. Il s'agit d'une version livrable d'un module. Une version livrable peut-être : une release, une milestone, une construction pour des tests d'intégration, une version alpha ou beta ou encore une construction via l'intégration continue ;
  • Statuts de révision (Status of a revision) : correspond à un indicateur de stabilité de la révision d'un module. La liste des statuts possibles est configurable. Les statuts par défaut dans Ivy sont integration (révisions non publiques en cours de développement), milestone (révisions publiques en voie d'être finalisées) et release (révisions publiques finalisées) ;
  • Configurations d'un module (Configurations of a module) : correspond à des définitions de dépendances selon l'utilisation d'un module. Par exemple, les dépendances ne sont pas les mêmes à la construction ou à l'exécution. Et même à l'exécution, les dépendances peuvent encore varier selon que le module soit utilisé dans une application desktop ou une application web (dans le schéma « jta » n'est pas une dépendance pour le module « exemple » pour une configuration « application web »). Cette notion se rapproche de la notion de scope dans Maven ;
  • Dépôt (Repository) : est un emplacement où Ivy peut trouver les artifacts et descripteurs des modules requis.

II-C. Fonctionnement

Voici le fonctionnement d'Ivy (la page de documentation originelle ici) :

Image non disponible

Lorsqu'un module n'est pas présent sur le dépôt privé, il est possible de l'installer depuis un dépôt public.

Lors de la résolution des dépendances, les modules sont récupérés depuis le dépôt privé dans le cache du poste local.

La récupération des dépendances consiste à recopier les artifacts depuis le cache vers un autre emplacement. Il est également possible de générer un chemin directement avec les emplacements des artifacts dans le cache.

Les versions d'un projet sont rendues disponibles grâce à la publication sur le dépôt privé.

Il est possible également de générer des rapports sur les dépendances.

Les différents types de dépôt du paramétrage par défaut sont (la page de documentation originelle : ici) :

  • local : privé à un utilisateur donné ;
  • partagé : partagé entre les membres d'une équipe ;
  • public : contient de nombreux modules et particulièrement des modules tiers.

Bien entendu, comme l'ont vu les utilisateurs de Maven avec celui-ci, en l'absence de dépôt privé, les dépendances sont résolues depuis un dépôt public (et copiées depuis ce dépôt dans le cache).

II-D. Paramétrage

En règle générale, il n'est pas nécessaire de modifier le paramétrage par défaut d'Ivy. Cependant, il est possible de définir un paramétrage grâce à un fichier XML généralement appelé « ivysettings.xml ». La documentation est ici.

Il est possible de paramétrer un grand nombre de mécanismes d'Ivy : analyseur de descripteur de module (parsers), résolveurs de dépendances (resolvers), statuts de révision, déclencheurs sur événements (triggers)…

De plus bien que les possibilités de paramétrage soient déjà très nombreuses, Ivy comporte également un système de plugins qui permet d'implémenter un mécanisme sur mesure. Ces plugins sont définis dans le paramétrage grâce au tag classpath qui permet d'ajouter des classes (jar) au classpath et au tag typedef qui permet de déclarer un plugin.

Le paramétrage le plus courant est la configuration d'un resolver avec un dépôt privé comme dans l'exemple ci-dessous.

Les resolvers cherchent les fichiers Ivy et les artifacts dans les dépôts. Il existe plusieurs types de dépôts (en général ibiblio mais également Ivy, dans le système de fichiers, sur un serveur web, etc. auquel correspondent des types de resolvers différents.

ivysettings.xml : Paramétrage d'un resolver avec un serveur Nexus en tant que resolver par défaut
CacherSélectionnez
  1. <ivysettings> 
  2.     <settings defaultResolver="depotPrive"/> 
  3.     <resolvers> 
  4.         <ibiblio name="depotPrive" m2compatible="true" root="http://serveur:8080/nexus/content/groups/public/"/> 
  5.     </resolvers> 
  6. </ivysettings> 

II-E. Descripteur de modules : ivy.xml

Les descripteurs de modules ou fichiers « ivy.xml » contiennent les différentes informations d'un module : son identité, les artifacts (publications) qui le composent et ses dépendances. La documentation est ici. Ci-dessous un exemple simple de fichier « ivy.xml ».

ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  4.   <info organisation="com.developpez" 
  5.         module="mon-module" 
  6.         revision="1.0" 
  7.         /> 
  8. </ivy-module> 

Ce descripteur indique le module est la révision 1.0 du module « mon-module » de l'organisation « com.developpez ». Le module n'a pas de dépendances, ni de publications.

L'exemple ci-dessous contient le même descripteur de module avec des publications et des dépendances. Les publications sont la publication par défaut (un jar classique correspondant au module) et une publication des sources. Les dépendances sont au nombre de trois avec trois exclusions dans l'arbre de dépendances (deux exclusions directement au niveau de ce module et une exclusion juste pour la branche de dépendance de spring-aop).

ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xmlns:e="http://ant.apache.org/ivy/extra" 
  4.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  5.   <info organisation="com.developpez" 
  6.         module="mon-module" 
  7.         revision="1.0" 
  8.         status="integration"> 
  9.   </info> 
  10.   <publications> 
  11.     <artifact /> 
  12.     <artifact name="mon-module" type="source" ext="jar" e:classifier="source"/> 
  13.   </publications> 
  14.   <dependencies> 
  15.     <dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  16.     <dependency org="commons-io" name="commons-io" rev="2.4"/> 
  17.     <dependency org="org.springframework" name="spring-aop" rev="3.2.4.RELEASE"> 
  18.       <exclude org="com.jamonapi" module="jamon"/> 
  19.     </dependency> 
  20.     <exclude org="commons-logging" module="commons-logging"/> 
  21.     <exclude org="commons-pool" module="commons-pool"/> 
  22.   </dependencies> 
  23. </ivy-module> 

II-F. Tâches et déclaration Ant

Le but de ce chapitre n'est pas de réaliser une liste exhaustive des tâches Ant et leurs possibilités. Il s'agit juste d'un aperçu. Il est important de bien comprendre que ces tâches comportent de nombreux paramètres, qu'il existe d'autres tâches et que ces paramètres et tâches sont non listés ici. La liste complète se trouve ici.

II-F-1. Tâche configure

La tâche configure permet de charger le paramétrage. Si elle n'est pas appelée explicitement, elle sera appelée sans paramètre lors de la première utilisation d'une tâche Ivy. Lorsque cette tâche est utilisée sans paramètre, elle charge soit le paramétrage contenu dans le fichier correspondant à la variable ${ivy.settings.file} (ivysettings.xml du dossier courant) s'il existe, soit le paramétrage par défaut contenu dans le jar d'Ivy.

Il ne faut pas confondre cette tâche « configure » avec la notion de configurations abordées au chapitre sur terminologie d'IvyTerminologie. Cette tâche n'a aucun lien avec la notion de configurations qui est propre à un module et concerne les dépendances liées à une utilisation du module. Tandis que « configure » et « settings » (ci-après) concernent le paramétrage d'Ivy (abordé au chapitre sur celui-ciParamétrage)

Voici un exemple d'un chargement explicite différent du paramétrage par défaut :

build.xml
CacherSélectionnez
  1. <ivy:configure file="c:\parametrageIvy\ivysettings.xml" /> 

Cela donne la trace d'exécution suivante :

Trace d'exécution
CacherSélectionnez
  1. [ivy:configure] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:configure] :: loading settings :: file = c:\parametrageIvy\ivysettings.xml 

Nous pouvons remarquer dans cette trace que le tag de début de ligne pour l'indication de chargement du paramétrage est ivy:configure. Dans les traces des exemples suivants, en l'absence de chargement explicite, l'indication de chargement sera associée à la première tâche Ivy.

II-F-2. Déclaration settings

La déclaration settings a le même but que la tâche configure. La seule différence est que settings déclare le paramétrage au lieu de le charger. Le paramétrage d'Ivy sera chargé lorsqu'il sera nécessaire : à la première tâche Ivy nécessitant ce paramétrage.

Voici un exemple de déclaration avec settings :

build.xml
CacherSélectionnez
  1. <ivy:settings file="c:\parametrageIvy\ivysettings.xml" /> 
  2. <echo>Texte entre settings et la suite</echo> 
  3. <ivy:resolve /> 

Cela donne la trace d'exécution suivante :

Trace d'exécution
CacherSélectionnez
  1.      [echo] Texte entre settings et la suite 
  2. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  3. [ivy:resolve] :: loading settings :: file = c:\parametrageIvy\ivysettings.xml 
  4. [ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0 
  5. [ivy:resolve]     confs: [default] 
  6. [ivy:resolve] :: resolution report :: resolve 135ms :: artifacts dl 0ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   0   |   0   |   0   |   0   ||   0   |   0   | 
  12.     --------------------------------------------------------------------- 

Nous pouvons remarquer dans cette trace que le chargement du paramétrage s'effectue avec l'appel de la tâche resolve (dans cet exemple, il n'y a pas de dépendances à résoudre).

II-F-3. Tâche resolve

La tâche resolve permet la résolution des dépendances du module : le résolveur indiqué dans le paramétrage recopie les dépendances dans le cache. Les dépendances peuvent être celles contenant dans le descripteur du module ou être définies dans l'appel de la tâche resolve.

L'appel ci-dessous provoque le chargement du paramétrage par défaut, la résolution des dépendances du fichier ivy.xml, puis la copie de ces dépendances dans le cache.

build.xml
CacherSélectionnez
  1. [<ivy:resolve /> 

Cela donne la trace d'exécution suivante :

Trace d'exécution
CacherSélectionnez
  1. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:resolve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0 
  4. [ivy:resolve]     confs: [default] 
  5. [ivy:resolve]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:resolve]     found commons-io#commons-io;2.4 in public 
  7. [ivy:resolve]     found org.springframework#spring-aop;3.2.4.RELEASE in public 
  8. [ivy:resolve]     found aopalliance#aopalliance;1.0 in public 
  9. [ivy:resolve]     found org.springframework#spring-beans;3.2.4.RELEASE in public 
  10. [ivy:resolve]     found org.springframework#spring-core;3.2.4.RELEASE in public 
  11. [ivy:resolve]     found org.aspectj#aspectjweaver;1.7.2 in public 
  12. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ... 
  13. [ivy:resolve] ............................ (364kB) 
  14. [ivy:resolve] .. (0kB) 
  15. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (892ms) 
  16. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ... 
  17. [ivy:resolve] .................. (277kB) 
  18. [ivy:resolve] .. (0kB) 
  19. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (666ms) 
  20. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ... 
  21. [ivy:resolve] ............................................. 
  22. [ivy:resolve] ........................ (1585kB) 
  23. [ivy:resolve] .. (0kB) 
  24. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2596ms) 
  25. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar ... 
  26. [ivy:resolve] ........................ (240kB) 
  27. [ivy:resolve] .. (0kB) 
  28. [ivy:resolve]     [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar(source) (645ms) 
  29. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar ... 
  30. [ivy:resolve] ................................ (180kB) 
  31. [ivy:resolve] .. (0kB) 
  32. [ivy:resolve]     [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar (540ms) 
  33. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-javadoc.jar ... 
  34. [ivy:resolve] ........................................... (707kB) 
  35. [ivy:resolve] .. (0kB) 
  36. [ivy:resolve]     [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar(javadoc) (1490ms) 
  37. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE-sources.jar ... 
  38. [ivy:resolve] .................................. (318kB) 
  39. [ivy:resolve] .. (0kB) 
  40. [ivy:resolve]     [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar(source) (765ms) 
  41. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE-javadoc.jar ... 
  42. [ivy:resolve] ........................................................ (768kB) 
  43. [ivy:resolve] .. (0kB) 
  44. [ivy:resolve]     [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar(javadoc) (1384ms) 
  45. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE.jar ... 
  46. [ivy:resolve] .................................. (327kB) 
  47. [ivy:resolve] .. (0kB) 
  48. [ivy:resolve]     [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar (746ms) 
  49. [ivy:resolve] downloading http://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.jar ... 
  50. [ivy:resolve] .. (4kB) 
  51. [ivy:resolve] .. (0kB) 
  52. [ivy:resolve]     [SUCCESSFUL ] aopalliance#aopalliance;1.0!aopalliance.jar (307ms) 
  53. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-beans/3.2.4.RELEASE/spring-beans-3.2.4.RELEASE.jar ... 
  54. [ivy:resolve] .......................................... (593kB) 
  55. [ivy:resolve] .. (0kB) 
  56. [ivy:resolve]     [SUCCESSFUL ] org.springframework#spring-beans;3.2.4.RELEASE!spring-beans.jar (1134ms) 
  57. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-core/3.2.4.RELEASE/spring-core-3.2.4.RELEASE.jar ... 
  58. [ivy:resolve] ................................................. (849kB) 
  59. [ivy:resolve] .. (0kB) 
  60. [ivy:resolve]     [SUCCESSFUL ] org.springframework#spring-core;3.2.4.RELEASE!spring-core.jar (1536ms) 
  61. [ivy:resolve] downloading http://repo1.maven.org/maven2/org/aspectj/aspectjweaver/1.7.2/aspectjweaver-1.7.2.jar ... 
  62. [ivy:resolve] ......................................... 
  63. [ivy:resolve] ...................... (1785kB) 
  64. [ivy:resolve] .. (0kB) 
  65. [ivy:resolve]     [SUCCESSFUL ] org.aspectj#aspectjweaver;1.7.2!aspectjweaver.jar (2957ms) 
  66. [ivy:resolve] :: resolution report :: resolve 6350ms :: artifacts dl 15693ms 
  67.     --------------------------------------------------------------------- 
  68.     |                  |            modules            ||   artifacts   | 
  69.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  70.     --------------------------------------------------------------------- 
  71.     |      default     |   7   |   7   |   7   |   0   ||   13  |   13  | 
  72.     --------------------------------------------------------------------- 

L'appel ci-dessous effectue presque la même chose : ici la dépendance résolue est celle qui est définie dans la tâche resolve.

build.xml
CacherSélectionnez
  1. <ivy:resolve> 
  2.   <ivy:dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  3. </ivy:resolve> 

Cela donne la trace d'exécution suivante :

Trace d'exécution
CacherSélectionnez
  1. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:resolve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:resolve] :: resolving dependencies :: #;working@R-PC 
  4. [ivy:resolve]     confs: [default] 
  5. [ivy:resolve]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ... 
  7. [ivy:resolve] ......................... (364kB) 
  8. [ivy:resolve] .. (0kB) 
  9. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (983ms) 
  10. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ... 
  11. [ivy:resolve] ................................................. 
  12. [ivy:resolve] .......... (1585kB) 
  13. [ivy:resolve] .. (0kB) 
  14. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2602ms) 
  15. [ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ... 
  16. [ivy:resolve] ............................... (277kB) 
  17. [ivy:resolve] .. (0kB) 
  18. [ivy:resolve]     [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (775ms) 
  19. [ivy:resolve] :: resolution report :: resolve 2274ms :: artifacts dl 4370ms 
  20.     --------------------------------------------------------------------- 
  21.     |                  |            modules            ||   artifacts   | 
  22.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  23.     --------------------------------------------------------------------- 
  24.     |      default     |   1   |   1   |   1   |   0   ||   3   |   3   | 
  25.     --------------------------------------------------------------------- 

Cette deuxième trace est correcte si le cache est vide au préalable, car si le cache contient déjà la dépendance cela donne la trace suivante :

Trace d'exécution
CacherSélectionnez
  1. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:resolve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:resolve] :: resolving dependencies :: #;working@R-PC 
  4. [ivy:resolve]     confs: [default] 
  5. [ivy:resolve]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:resolve] :: resolution report :: resolve 131ms :: artifacts dl 4ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   1   |   0   |   0   |   0   ||   3   |   0   | 
  12.     --------------------------------------------------------------------- 

II-F-4. Tâche retrieve

La tâche retrieve permet de copier les dépendances (qui ont été résolues) depuis le cache vers un emplacement choisi (ou par défaut un dossier lib dans le dossier courant). Cette tâche appelle la tâche resolve si elle n'a pas été appelée avant.

Ainsi le code suivant :

build.xml
CacherSélectionnez
  1. <ivy:resolve> 
  2.   <ivy:dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  3. </ivy:resolve> 
  4. <ivy:retrieve> 
  5.   <ivy:dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  6. </ivy:retrieve> 

Provoque cette trace :

Trace d'exécution
CacherSélectionnez
  1. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:resolve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:resolve] :: resolving dependencies :: #;working@R-PC 
  4. [ivy:resolve]     confs: [default] 
  5. [ivy:resolve]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:resolve] :: resolution report :: resolve 107ms :: artifacts dl 3ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   1   |   0   |   0   |   0   ||   3   |   0   | 
  12.     --------------------------------------------------------------------- 
  13. [ivy:retrieve] :: retrieving :: # 
  14. [ivy:retrieve]     confs: [default] 
  15. [ivy:retrieve]     0 artifacts copied, 3 already retrieved (0kB/3ms) 

Tandis que le code suivant :

build.xml
CacherSélectionnez
  1. <ivy:retrieve> 
  2.   <ivy:dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  3. </ivy:retrieve> 

Provoque cette trace :

Trace d'exécution
CacherSélectionnez
  1. [ivy:retrieve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:retrieve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:retrieve] :: resolving dependencies :: #;working@R-PC 
  4. [ivy:retrieve]     confs: [default] 
  5. [ivy:retrieve]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:retrieve] :: resolution report :: resolve 105ms :: artifacts dl 4ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   1   |   0   |   0   |   0   ||   3   |   0   | 
  12.     --------------------------------------------------------------------- 
  13. [ivy:retrieve] :: retrieving :: # 
  14. [ivy:retrieve]     confs: [default] 
  15. [ivy:retrieve]     0 artifacts copied, 3 already retrieved (0kB/3ms) 

Nous remarquons qu'en l'absence d'appel à la tâche resolve c'est la tâche retrieve qui effectue cet appel.

II-F-5. Tâche report

La tâche report génère des rapports sur la résolution de dépendances. Cette tâche n'appelle pas implicitement d'autres tâches Ivy mise à part celle de configuration. Pour réaliser les rapports, cette tâche utilise le rapport XML contenu dans le cache pour la dernière résolution de dépendances du module pour lequel nous souhaitons une génération de rapports (il est donc nécessaire que la résolution soit effectuée avant, dans la même exécution de script Ant ou encore avant).

Le code suivant :

build.xml
CacherSélectionnez
  1. <ivy:report conf="default" organisation="com.developpez" module="mon-module" /> 

Utilise le fichier « com.developpez-mon-module-default.xml » contenu dans le cache et provoque cette trace :

Trace d'exécution
CacherSélectionnez
  1. [ivy:report] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:report] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:report] Processing C:\Users\R\.ivy2\cache\com.developpez-mon-module-default.xml to D:\workspaceKep\Ivy\com.developpez-mon-module-default.html 
  4. [ivy:report] Processing C:\Users\R\.ivy2\cache\com.developpez-mon-module-default.xml to D:\workspaceKep\Ivy\com.developpez-mon-module-default.graphml 

Le rapport généré a cet aspect :

Image non disponible

Remarque : par défaut la tâche génère également un fichier graphml.

II-F-6. Tâche cachepath

La tâche cachepath permet (comme dans l'exemple du paragraphe II-A - InstallationInstallation) de générer un chemin Ant à partir d'artifacts contenus dans le cache. Cette tâche appelle la tâche resolve si elle n'a pas été appelée avant.

Le code suivant :

build.xml
CacherSélectionnez
  1. <ivy:cachepath pathid="classcache" /> 
  2. <javac srcdir="src" destdir="bin" classpathref="classcache" includeantruntime="false" /> 

Génère un chemin Ant des dépendances et compile les sources avec ce chemin en tant que classpath.

Trace d'exécution
CacherSélectionnez
  1. [ivy:cachepath] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:cachepath] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:cachepath] :: resolving dependencies :: com.developpez#mon-module;1.0 
  4. [ivy:cachepath]     confs: [default] 
  5. [ivy:cachepath]     found commons-lang#commons-lang;2.6 in public 
  6. [ivy:cachepath]     found commons-io#commons-io;2.4 in public 
  7. [ivy:cachepath]     found org.springframework#spring-aop;3.2.4.RELEASE in public 
  8. [ivy:cachepath]     found aopalliance#aopalliance;1.0 in public 
  9. [ivy:cachepath]     found org.springframework#spring-beans;3.2.4.RELEASE in public 
  10. [ivy:cachepath]     found org.springframework#spring-core;3.2.4.RELEASE in public 
  11. [ivy:cachepath]     found org.aspectj#aspectjweaver;1.7.2 in public 
  12. [ivy:cachepath] :: resolution report :: resolve 201ms :: artifacts dl 17ms 
  13.     --------------------------------------------------------------------- 
  14.     |                  |            modules            ||   artifacts   | 
  15.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  16.     --------------------------------------------------------------------- 
  17.     |      default     |   7   |   0   |   0   |   0   ||   13  |   0   | 
  18.     --------------------------------------------------------------------- 
  19.     [javac] Compiling 1 source file to D:\workspaceKep\Ivy\bin 

II-F-7. Tâche cleancache

La tâche cleancache supprime tous les fichiers du cache, comme dans l'exemple ci-dessous.

build.xml
CacherSélectionnez
  1. <ivy:cleancache /> 

II-F-8. Tâche publish

La tâche publish publie les artifacts dans un dépôt. Les artifacts doivent être déclarés dans les publications du descripteur de module.

Ainsi si le descripteur de module indique deux artifacts comme ceci :

ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  4.   <info organisation="com.developpez" 
  5.         module="mon-module" 
  6.         revision="1.0" 
  7.         status="integration"> 
  8.   </info> 
  9.   <publications> 
  10.     <artifact /> 
  11.     <artifact name="mon-module" type="source" ext="jar" e:classifier="source"/> 
  12.   </publications> 
  13.   <dependencies> 
  14.     <dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  15.   </dependencies> 
  16. </ivy-module> 

Et que le fichier build.xml contient les tâches suivantes :

build.xml
CacherSélectionnez
  1. <!-- Copie des dépendances dans le dossier lib et compilation --> 
  2. <ivy:retrieve /> 
  3. <javac srcdir="src" destdir="bin" includeantruntime="false"> 
  4.   <classpath> 
  5.     <fileset dir="lib" includes="*.jar" /> 
  6.   </classpath> 
  7. </javac> 
  8.  
  9. <!-- Génération des jars à publier --> 
  10. <jar destfile="build/jar/${ivy.module}-${ivy.revision}.jar" basedir="bin" /> 
  11. <jar destfile="build/source/${ivy.module}-${ivy.revision}-source.jar" basedir="src" /> 
  12.  
  13. <!-- Publication dans le dépôt local --> 
  14. <ivy:publish resolver="local" > 
  15.   <ivy:artifacts pattern="build/[type]/[artifact]-[revision](-[classifier]).[ext]" /> 
  16. </ivy:publish> 

À l'exécution cela donne la trace suivante.

Trace d'exécution
CacherSélectionnez
  1. [ivy:retrieve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:retrieve] :: loading settings :: url = jar:file:/F:/eclipse/plugins/org.apache.ivy.eclipse.ant_2.3.0.final_20130110142753/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml 
  3. [ivy:retrieve] :: resolving dependencies :: com.developpez#mon-module;1.0 
  4. [ivy:retrieve]     confs: [default] 
  5. [ivy:retrieve]     found commons-lang#commons-lang;2.6 in default 
  6. [ivy:retrieve] :: resolution report :: resolve 100ms :: artifacts dl 5ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   1   |   0   |   0   |   0   ||   3   |   0   | 
  12.     --------------------------------------------------------------------- 
  13. [ivy:retrieve] :: retrieving :: com.developpez#mon-module 
  14. [ivy:retrieve]     confs: [default] 
  15. [ivy:retrieve]     0 artifacts copied, 3 already retrieved (0kB/46ms) 
  16.       [jar] Building jar: D:\workspaceKep\Module\build\jar\mon-module-1.0.jar 
  17.       [jar] Building jar: D:\workspaceKep\Module\build\source\mon-module-1.0-source.jar 
  18. [ivy:publish] :: delivering :: com.developpez#mon-module;1.0 :: 1.0 :: integration :: Sun Aug 25 20:09:17 CEST 2013 
  19. [ivy:publish]     delivering ivy file to D:\workspaceKep\Module\build\ivy\ivy-1.0.xml 
  20. [ivy:publish] :: publishing :: com.developpez#mon-module 
  21. [ivy:publish]     published mon-module to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\jars\mon-module.jar 
  22. [ivy:publish]     published mon-module to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\sources\mon-module.jar 
  23. [ivy:publish]     published ivy to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\ivys\ivy.xml 
  24. [ivy:publish]     publish commited: moved C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part  
  25. [ivy:publish]         to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0 

Les artifacts sont publiés dans le dépôt local (sous-dossier .ivy2\local\com.developpez\mon-module\1.0 du dossier de l'utilisateur).

II-F-9. Tâche makepom

La tâche makepom crée un fichier POM (Project Object Model) de Maven. Cela permet par exemple de publier sur un dépôt Maven.

L'exemple ci-dessous permet de publier les artifacts dans un dépôt Nexus.

ivysettings.xml
CacherSélectionnez
  1. <ivysettings> 
  2.   <include url="${ivy.default.settings.dir}/ivysettings.xml"/>  
  3.   <credentials  
  4.       host="localhost"  
  5.       realm="Sonatype Nexus Repository Manager" 
  6.       username="deployment"  
  7.       passwd="deployment123" /> 
  8.   <resolvers> 
  9.     <ibiblio  
  10.         name="depotPrive"  
  11.         m2compatible="true" 
  12.         root="http://localhost:8080/nexus/content/repositories/releases/" /> 
  13.   </resolvers> 
  14. </ivysettings> 
ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xmlns:e="http://ant.apache.org/ivy/extra" 
  4.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  5.   <info organisation="com.developpez" 
  6.         module="mon-module" 
  7.         revision="1.0" 
  8.         status="integration"> 
  9.   </info> 
  10.   <publications> 
  11.     <artifact /> 
  12.     <artifact name="mon-module" type="source" ext="jar" e:classifier="source"/> 
  13.     <artifact name="mon-module" type="pom" /> 
  14.   </publications> 
  15.   <dependencies> 
  16.     <dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  17.   </dependencies> 
  18. </ivy-module> 
build.xml
CacherSélectionnez
  1. <ivy:resolve /> 
  2.  
  3. <!-- Création des artifacts et du fichier POM --> 
  4. <jar destfile="build/jar/${ivy.module}-${ivy.revision}.jar" basedir="bin" /> 
  5. <jar destfile="build/source/${ivy.module}-${ivy.revision}-source.jar" basedir="src" /> 
  6. <ivy:makepom ivyfile="ivy.xml" pomfile="build/pom/${ivy.module}-${ivy.revision}.pom" /> 
  7.  
  8. <!-- Publication --> 
  9. <ivy:publish resolver="depotPrive" publishivy="false" > 
  10.   <ivy:artifacts pattern="build/[type]/[artifact]-[revision](-[classifier]).[ext]" /> 
  11. </ivy:publish> 
Trace d'exécution
CacherSélectionnez
  1. [ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ :: 
  2. [ivy:resolve] :: loading settings :: file = D:\workspaceKep\Module\ivysettings.xml 
  3. [ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0 
  4. [ivy:resolve]     confs: [default] 
  5. [ivy:resolve]     found commons-lang#commons-lang;2.6 in default 
  6. [ivy:resolve] :: resolution report :: resolve 88ms :: artifacts dl 3ms 
  7.     --------------------------------------------------------------------- 
  8.     |                  |            modules            ||   artifacts   | 
  9.     |       conf       | number| search|dwnlded|evicted|| number|dwnlded| 
  10.     --------------------------------------------------------------------- 
  11.     |      default     |   1   |   0   |   0   |   0   ||   3   |   0   | 
  12.     --------------------------------------------------------------------- 
  13.       [jar] Building jar: D:\workspaceKep\Module\build\jar\mon-module-1.0.jar 
  14.       [jar] Building jar: D:\workspaceKep\Module\build\source\mon-module-1.0-source.jar 
  15. [ivy:publish] :: publishing :: com.developpez#mon-module 
  16. [ivy:publish]     published mon-module to http://localhost:8080/nexus/content/repositories/releases/com/developpez/mon-module/1.0/mon-module-1.0.jar 
  17. [ivy:publish]     published mon-module to http://localhost:8080/nexus/content/repositories/releases/com/developpez/mon-module/1.0/mon-module-1.0-source.jar 
  18. [ivy:publish]     published mon-module to http://localhost:8080/nexus/content/repositories/releases/com/developpez/mon-module/1.0/mon-module-1.0.pom 

III. IVYDE

III-A. Installation

Cliquez sur « Install New Software… » dans le menu « Help » :

Image non disponible

Cliquez sur « Add… » :

Image non disponible

Saisissez « IvyDE Update Site » dans « Name » et « http://www.apache.org/dist/ant/ivyde/updatesite » dans « Location ». Puis cliquez sur « OK » :

Image non disponible

Cochez « Apache Ivy library » et « Apache IvyDE Eclipse plugins ». Puis cliquez sur « Next > » :

Image non disponible

Cliquez sur « Next > » :

Image non disponible

Sélectionnez « I accept the terms of the license agreements ». Puis cliquez sur « Finish » :

Image non disponible

Le plugin est en cours de téléchargement :

Image non disponible

Cliquez sur « OK » :

Image non disponible

Cliquez sur « Yes » :

Image non disponible

III-B. Projets d'exemples

Les projets correspondant à la présentation du plugin IvyDE sont les trois projets suivants. Ces projets pour l'exemple ne comportent pas de sources : ils comportent uniquement un fichier « ivy.xml » ou « pom.xml » (pour l'exemple Maven).

III-B-1. TestIncluant

Ce projet a une dépendance sur les deux projets suivant, ainsi qu'une dépendance sur commons-io et commons-lang.

ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  4.     <info organisation="com.developpez" module="test-incluant" revision="2.0" status="integration"> 
  5.     </info> 
  6.     <dependencies> 
  7.         <dependency org="commons-lang" name="commons-lang" rev="2.6"/> 
  8.         <dependency org="commons-io" name="commons-io" rev="2.0"/> 
  9.         <dependency org="com.developpez" name="test-inclus" rev="1.0" /> 
  10.         <dependency org="com.developpez" name="test-pom" rev="1.5" /> 
  11.     </dependencies> 
  12. </ivy-module> 

III-B-2. TestInclus

Ce projet a uniquement une dépendance sur commons-lang avec volontairement pour l'exemple une version différente.

ivy.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.                           xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
  4.     <info organisation="com.developpez" module="test-inclus" revision="1.0" status="integration"> 
  5.     </info> 
  6.     <dependencies> 
  7.         <dependency org="commons-lang" name="commons-lang" rev="2.4"/> 
  8.     </dependencies> 
  9. </ivy-module> 

III-B-3. TestPom

Ce projet est un projet Maven (pom.xml) avec uniquement une dépendance sur commons-lang avec encore pour l'exemple une version différente.

pom.xml
CacherSélectionnez
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
  5.   <modelVersion>4.0.0</modelVersion> 
  6.   <groupId>com.developpez</groupId> 
  7.   <artifactId>test-pom</artifactId> 
  8.   <version>1.5</version> 
  9.   <dependencies> 
  10.       <dependency> 
  11.           <groupId>commons-lang</groupId> 
  12.           <artifactId>commons-lang</artifactId> 
  13.           <version>2.0</version> 
  14.       </dependency> 
  15.   </dependencies> 
  16. </project> 

III-C. Activation de IvyDE dans un projet

Pour activer IvyDE dans un projet contenant un fichier « ivy.xml » ou « pom.xml », il suffit de faire un clic droit sur le fichier et de choisir « Add Ivy Library… » :

Image non disponible

Après il suffit de cliquer sur « Finish » pour garder les paramètres par défaut :

Image non disponible

Après un temps de traitement, la bibliothèque apparaît avec les dépendances incluses :

Image non disponible

Toute modification du fichier « ivy.xml » ou « pom.xml » provoqueront une modification des dépendances dans la bibliothèque.

La bibliothèque est visible dans les bibliothèques du projet :

Image non disponible

Il est possible de retrouver les paramètres d'IvyDE en cliquant sur le bouton « Edit… » une fois la bibliothèque sélectionnée :

Image non disponible

III-D. Résolution des dépendances dans le workspace

Le projet « TestIncluant » a des dépendances vers les deux autres projets d'exemple. Il faut donc activer la résolution des dépendances dans le workspace pour ce projet. C'est possible en modifiant les paramètres IvyDE de la bibliothèque :

Image non disponible

Une fois la résolution dans le workspace activée, on retrouve les deux autres projets dans la bibliothèque de IvyDE pour le projet TestIncluant :

Image non disponible

III-E. Vues

III-E-1. Ivy Report

En sélectionnant une bibliothèque IvyDE, un rapport (le même que celui généré par la tâche Ivy report) apparaît dans la vue :

Image non disponible
Image non disponible

III-E-2. Reverse Dependancy Explorer

Les différentes dépendances des projets du workspace apparaissent dans cette vue. Lorsque plusieurs projets ont des dépendances sur le même module avec des versions différentes, cette dépendance est en rouge :

Image non disponible

Il est possible d'indiquer quelle version doit être fixée dans ces projets :

Image non disponible

Pour appliquer cette nouvelle version, il faut cliquer sur l'icône de synchronisation :

Image non disponible

Il faut ensuite valider ce choix :

Image non disponible

Cependant, le plugin ne fixe la nouvelle version que dans les fichiers « ivy.xml ». Il suffit de modifier manuellement le fichier « pom.xml » :

Image non disponible

IV. CONCLUSION

Nous avons pu voir qu'Ivy est une vraie alternative à l'utilisation de Maven pour la gestion des dépendances. C'est une solution :

  • complète et paramétrable (de plus il est possible de rajouter des plugins pour des besoins particuliers) ;
  • intégrée à Eclipse grâce au plugin IvyDE et Ant, mais bien que non vu dans cet article Ivy peut fonctionner indépendamment en ligne de commande ;
  • documentée (voir le site d'Ivy) ;
  • pérenne (car soutenu par la fondation Apache).

Cependant Ivy n'est pas qu'une alternative à Maven. En effet, comme vu dans cet article, il est tout à fait possible de faire cohabiter des projets avec Maven et des projets avec Ivy : IvyDE supporte très bien les fichiers « pom.xml » et Ivy peut résoudre ses dépendances avec des dépôts Maven et peut également publier sur ceux-ci.

V. REMERCIEMENTS

Je remercie très sincèrement :