Tutoriel sur la gestion des dépendances avec Ivy et IvyDE

Régis POUILLER

Cet article présente l'outil de gestion de dépendances Ivy et son plugin Eclipse IvyDE.

Une discussion a été ouverte pour les commentaires sur la publication de cet article : [ Commentez ]

- Titre : Tutoriel sur la gestion des dépendances avec Ivy et IvyDE

- Auteur : Régis POUILLER

- Parution : 30 septembre 2013

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Régis POUILLER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.

Sommaire

- I. INTRODUCTION

- I-A. Objectif

- I-B. Connaissances prérequises

- I-C. Autres ressources

- II. IVY

- II-A. Installation

- II-B. Terminologie

- II-C. Fonctionnement

- II-D. Paramétrage

- II-E. Descripteur de modules : ivy.xml

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

- II-F-1. Tâche configure

- II-F-2. Déclaration settings

- II-F-3. Tâche resolve

- II-F-4. Tâche retrieve

- II-F-5. Tâche report

- II-F-6. Tâche cachepath

- II-F-7. Tâche cleancache

- II-F-8. Tâche publish

- II-F-9. Tâche makepom

- III. IVYDE

- III-A. Installation

- III-B. Projets d'exemples

- III-B-1. TestIncluant

- III-B-2. TestInclus

- III-B-3. TestPom

- III-C. Activation de IvyDE dans un projet

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

- III-E. Vues

- III-E-1. Ivy Report

- III-E-2. Reverse Dependancy Explorer

- IV. CONCLUSION

- V. REMERCIEMENTS

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

Sur Developpez.com :

- Comparatif des outils de build pour Java par Romain Linsolas ;

- Tutoriel sur les fonctionnalités de l'outil de build EasyAnt par Dridi Boukelmoune de Zenika.

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

1. <project name="exemple-hello-ivy" default="hello-ivy" xmlns:ivy="antlib:org.apache.ivy.ant">

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" />

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="" />

24. <property name="build.dir" value="bin" />

25. <property name="src.dir" value="src" />

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>

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>

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>

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>

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">

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>

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>

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>

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;

138. import org.apache.commons.lang.WordUtils;

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>

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"/>

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" />

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 :

1. D:\workspaceKep\HelloIvy>ant

2. Buildfile: D:\workspaceKep\HelloIvy\build.xml

4. test-params-proxy-presents:

6. init.proxy:

8. test-ivy-jar-present:

10. affiche-ivy-jar-present:

12. affiche-ivy-jar-pas-present:

13. [echo] Le jar d'Ivy est absent

15. test-ivy-http-accessible:

17. affiche-ivy-http-accessible:

18. [echo] L'URL du jar d'Ivy est accessible

20. affiche-ivy-http-pas-accessible:

22. download-ivy:

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

31. install-ivy:

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 !

78. BUILD SUCCESSFUL

79. Total time: 10 seconds

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) :

- 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) :

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

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

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

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'Ivy. 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-ci)

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

build.xml

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

Cela donne la trace d'exécution suivante :

Trace d'exécution

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

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

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

1. [<ivy:resolve />

Cela donne la trace d'exécution suivante :

Trace d'exécution

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

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

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

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

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

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

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

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

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

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 :

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 - Installation) 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

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

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

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

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

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>

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" />

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

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

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

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

1. <ivy:resolve />

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" />

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

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 » :

Cliquez sur « Add… » :

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

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

Cliquez sur « Next > » :

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

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

Cliquez sur « OK » :

Cliquez sur « Yes » :

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

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

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

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… » :

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

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

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 :

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

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 :

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 :

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 :

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 :

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

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

Il faut ensuite valider ce choix :

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

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 :

- www.developpez.com qui me permet de publier cet article ;

- Nono40 et djibril pour leurs outils ;

- le créateur d'Ivy Xavier Hanin pour sa relecture technique et sa disponibilité ;

- Mickael Baron pour sa relecture technique ;

- zoom61 et ClaudeLELOUP pour leur relecture orthographique rigoureuse.