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)
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
<project
name
=
"exemple-hello-ivy"
default
=
"hello-ivy"
xmlns
:
ivy
=
"antlib:org.apache.ivy.ant"
>
<!-- Indique la version de Ivy nécessaire pour le build -->
<property
name
=
"ivy.install.version"
value
=
"2.3.0"
/>
<!-- Dossier contenant Ivy -->
<property
name
=
"ivy.jar.dir"
value
=
"${basedir}/ivy"
/>
<!-- Jar d'Ivy -->
<property
name
=
"ivy.jar.file"
value
=
"${ivy.jar.dir}/ivy-${ivy.install.version}.jar"
/>
<!-- URL du jar d'Ivy sur le repository Maven -->
<property
name
=
"ivy.jar.url"
value
=
"http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
/>
<!-- Paramètres du proxy -->
<!-- Nom de la machine proxy -->
<property
name
=
"proxy.host"
value
=
""
/>
<!-- Port du proxy -->
<property
name
=
"proxy.port"
value
=
""
/>
<!-- Compte pour accéder au proxy -->
<property
name
=
"proxy.user"
value
=
""
/>
<!-- Mot de passe pour accéder au proxy -->
<property
name
=
"proxy.password"
value
=
""
/>
<!-- Liste d'adresses séparées par une barre verticale | ne nécessitant pas le proxy -->
<property
name
=
"proxy.ignore"
value
=
""
/>
<property
name
=
"build.dir"
value
=
"bin"
/>
<property
name
=
"src.dir"
value
=
"src"
/>
<!-- ======================================================================================
Target init.proxy : initialise le proxy
====================================================================================== -->
<target
name
=
"test-params-proxy-presents"
>
<condition
property
=
"params-proxy-presents"
>
<not>
<equals
arg1
=
"${proxy.host}"
arg2
=
""
/>
</not>
</condition>
</target>
<target
name
=
"init.proxy"
depends
=
"test-params-proxy-presents"
if
=
"params-proxy-presents"
>
<setproxy
proxyhost
=
"${proxy.host}"
proxyport
=
"${proxy.port}"
proxyuser
=
"${proxy.user}"
proxypassword
=
"${proxy.password}"
nonproxyhosts
=
"${proxy.ignore}"
/>
</target>
<!-- ======================================================================================
Target clean-ivy : supprime l'installation d'Ivy
====================================================================================== -->
<target
name
=
"clean-ivy"
description
=
"Suppression de l'installation d'Ivy"
>
<echo
message
=
"Suppression de l'installation d'Ivy"
/>
<delete
dir
=
"${ivy.jar.dir}"
/>
</target>
<!-- ======================================================================================
Target test-ivy-jar-present : teste l'installation d'Ivy
====================================================================================== -->
<target
name
=
"test-ivy-jar-present"
>
<available
property
=
"ivy-jar-present"
file
=
"${ivy.jar.file}"
/>
</target>
<target
name
=
"affiche-ivy-jar-present"
depends
=
"test-ivy-jar-present"
if
=
"ivy-jar-present"
>
<echo
message
=
"Le jar d'Ivy est present"
/>
</target>
<target
name
=
"affiche-ivy-jar-pas-present"
depends
=
"test-ivy-jar-present"
unless
=
"ivy-jar-present"
>
<echo
message
=
"Le jar d'Ivy est absent"
/>
</target>
<!-- ======================================================================================
Target test-ivy-http-accessible : teste accessibilite d'Ivy dans le repository Maven
====================================================================================== -->
<target
name
=
"test-ivy-http-accessible"
>
<condition
property
=
"ivy-http-accessible"
>
<http
url
=
"${ivy.jar.url}"
/>
</condition>
</target>
<target
name
=
"affiche-ivy-http-accessible"
depends
=
"test-ivy-http-accessible"
if
=
"ivy-http-accessible"
>
<echo
message
=
"L'URL du jar d'Ivy est accessible"
/>
</target>
<target
name
=
"affiche-ivy-http-pas-accessible"
depends
=
"test-ivy-http-accessible"
unless
=
"ivy-http-accessible"
>
<echo
message
=
"L'URL du jar d'Ivy est inaccessible"
/>
</target>
<!-- ======================================================================================
Target download-ivy : télécharge Ivy
====================================================================================== -->
<target
name
=
"download-ivy"
depends
=
"test-ivy-jar-present,affiche-ivy-jar-present,affiche-ivy-jar-pas-present,
test-ivy-http-accessible,affiche-ivy-http-accessible,affiche-ivy-http-pas-accessible"
unless
=
"ivy-jar-present"
if
=
"ivy-http-accessible"
description
=
"Telechargement d'Ivy"
>
<antcall
target
=
"clean-ivy"
/>
<mkdir
dir
=
"${ivy.jar.dir}"
/>
<echo
message
=
"Telechargement de la version ${ivy.install.version} d'Ivy depuis le repository Maven"
/>
<get
src
=
"${ivy.jar.url}"
dest
=
"${ivy.jar.file}"
usetimestamp
=
"true"
/>
</target>
<!-- ======================================================================================
Target install-ivy : installe Ivy (vérifie la version de ant et la présence du jar)
====================================================================================== -->
<target
name
=
"install-ivy"
depends
=
"init.proxy,download-ivy"
description
=
"Installation d'Ivy"
>
<fail
message
=
"La version de ant est incorrecte (1.6.0 minimum)"
>
<condition>
<not>
<antversion
atleast
=
"1.6.0"
/>
</not>
</condition>
</fail>
<fail
message
=
"Le fichier Jar de Ivy est manquant"
>
<condition>
<not>
<available
file
=
"${ivy.jar.file}"
/>
</not>
</condition>
</fail>
<path
id
=
"ivy.lib.path"
>
<fileset
dir
=
"${ivy.jar.dir}"
includes
=
"*.jar"
/>
</path>
<taskdef
resource
=
"org/apache/ivy/ant/antlib.xml"
uri
=
"antlib:org.apache.ivy.ant"
classpathref
=
"ivy.lib.path"
/>
</target>
<!-- ======================================================================================
Target hello-ivy : exemple permettant de valider l'installation d'Ivy
====================================================================================== -->
<target
name
=
"hello-ivy"
depends
=
"install-ivy"
description
=
"Exemple d'utilisation d'Ivy"
>
<!-- Suppression les dossiers d'exemple -->
<echo
message
=
"Suppression des dossiers d'exemple"
/>
<delete
includeemptydirs
=
"true"
quiet
=
"true"
>
<fileset
dir
=
"${src.dir}"
/>
<fileset
dir
=
"${build.dir}"
/>
</delete>
<!-- Creation du source Hello.java -->
<echo
message
=
"Creation du source Hello.java"
/>
<mkdir
dir
=
"${src.dir}/example"
/>
<echo
file
=
"${src.dir}/example/Hello.java"
>
package example;
import org.apache.commons.lang.WordUtils;
public class Hello {
public static void main(String[] args) {
String message = "hello ivy !";
System.out.println("standard message : " + message);
System.out.println("capitalized by " + WordUtils.class.getName()
+ " : " + WordUtils.capitalizeFully(message));
}
}
</echo>
<!-- Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6 -->
<echo
message
=
"Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6"
/>
<
ivy
:
cachepath
organisation
=
"commons-lang"
module
=
"commons-lang"
revision
=
"2.6"
pathid
=
"lib.path.id"
inline
=
"true"
/>
<!-- Compilation -->
<echo
message
=
"Compilation"
/>
<mkdir
dir
=
"${build.dir}"
/>
<javac
srcdir
=
"${src.dir}"
destdir
=
"${build.dir}"
includeantruntime
=
"false"
classpathref
=
"lib.path.id"
/>
<!-- Execution -->
<echo
message
=
"Execution"
/>
<java
classname
=
"example.Hello"
>
<classpath>
<path
refid
=
"lib.path.id"
/>
<path
location
=
"${build.dir}"
/>
</classpath>
</java>
</target>
</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 :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
D:\workspaceKep\HelloIvy>ant
Buildfile: D:\workspaceKep\HelloIvy\build.xml
test-params-proxy-presents:
init.proxy:
test-ivy-jar-present:
affiche-ivy-jar-present:
affiche-ivy-jar-pas-present:
[echo] Le jar d'Ivy est absent
test-ivy-http-accessible:
affiche-ivy-http-accessible:
[echo] L'URL du jar d'Ivy est accessible
affiche-ivy-http-pas-accessible:
download-ivy:
clean-ivy:
[echo] Suppression de l'installation d'Ivy
[mkdir] Created dir: D:\workspaceKep\HelloIvy\ivy
[echo] Telechargement de la version 2.3.0 d'Ivy depuis le repository Maven
[get] Getting: http://repo1.maven.org/maven2/org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar
[get] To: D:\workspaceKep\HelloIvy\ivy\ivy-2.3.0.jar
install-ivy:
hello-ivy:
[echo] Suppression des dossiers d'exemple
[echo] Creation du source Hello.java
[mkdir] Created dir: D:\workspaceKep\HelloIvy\src\example
[echo] Utilisation d'Ivy pour résoudre une dépendance vers commons-lang 2.6
[ivy:cachepath] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[ivy:cachepath] :: loading settings :: url = jar:file:/D:/workspaceKep/HelloIvy/ivy/ivy-2.3.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:cachepath] :: resolving dependencies :: commons-lang#commons-lang-caller;working
[ivy:cachepath] confs: [default, master, compile, provided, runtime, system, sources, javadoc, optional]
[ivy:cachepath] found commons-lang#commons-lang;2.6 in public
[ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ...
[ivy:cachepath] ............................................. (364kB)
[ivy:cachepath] .. (0kB)
[ivy:cachepath] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (790ms)
[ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ...
[ivy:cachepath] ................................... (277kB)
[ivy:cachepath] .. (0kB)
[ivy:cachepath] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (650ms)
[ivy:cachepath] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ...
[ivy:cachepath] ........................................................................
[ivy:cachepath] .................................... (1585kB)
[ivy:cachepath] .. (0kB)
[ivy:cachepath] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2580ms)
[ivy:cachepath] :: resolution report :: resolve 50ms :: artifacts dl 4030ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 1 | 1 |
| master | 1 | 0 | 0 | 0 || 1 | 1 |
| compile | 1 | 0 | 0 | 0 || 0 | 0 |
| provided | 1 | 0 | 0 | 0 || 0 | 0 |
| runtime | 1 | 0 | 0 | 0 || 0 | 0 |
| system | 1 | 0 | 0 | 0 || 0 | 0 |
| sources | 1 | 0 | 0 | 0 || 1 | 1 |
| javadoc | 1 | 0 | 0 | 0 || 1 | 1 |
| optional | 1 | 0 | 0 | 0 || 0 | 0 |
---------------------------------------------------------------------
[echo] Compilation
[mkdir] Created dir: D:\workspaceKep\HelloIvy\bin
[javac] Compiling 1 source file to D:\workspaceKep\HelloIvy\bin
[echo] Execution
[java] standard message : hello ivy !
[java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy !
BUILD SUCCESSFUL
Total time: 10 seconds
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.
2.
3.
4.
5.
6.
<ivysettings>
<settings
defaultResolver
=
"depotPrive"
/>
<resolvers>
<ibiblio
name
=
"depotPrive"
m2compatible
=
"true"
root
=
"http://serveur:8080/nexus/content/groups/public/"
/>
</resolvers>
</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 ».
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"mon-module"
revision
=
"1.0"
/>
</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).
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
:
e
=
"http://ant.apache.org/ivy/extra"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"mon-module"
revision
=
"1.0"
status
=
"integration"
>
</info>
<publications>
<artifact />
<artifact
name
=
"mon-module"
type
=
"source"
ext
=
"jar"
e
:
classifier
=
"source"
/>
</publications>
<dependencies>
<dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
<dependency
org
=
"commons-io"
name
=
"commons-io"
rev
=
"2.4"
/>
<dependency
org
=
"org.springframework"
name
=
"spring-aop"
rev
=
"3.2.4.RELEASE"
>
<exclude
org
=
"com.jamonapi"
module
=
"jamon"
/>
</dependency>
<exclude
org
=
"commons-logging"
module
=
"commons-logging"
/>
<exclude
org
=
"commons-pool"
module
=
"commons-pool"
/>
</dependencies>
</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 :
<
ivy
:
configure
file
=
"c:\parametrageIvy\ivysettings.xml"
/>
Cela donne la trace d'exécution suivante :
2.
[ivy:configure] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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 :
2.
3.
<
ivy
:
settings
file
=
"c:\parametrageIvy\ivysettings.xml"
/>
<echo>
Texte entre settings et la suite</echo>
<
ivy
:
resolve />
Cela donne la trace d'exécution suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[echo] Texte entre settings et la suite
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[ivy:resolve] :: loading settings :: file = c:\parametrageIvy\ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0
[ivy:resolve] confs: [default]
[ivy:resolve] :: resolution report :: resolve 135ms :: artifacts dl 0ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 0 | 0 | 0 | 0 || 0 | 0 |
---------------------------------------------------------------------
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.
[<
ivy
:
resolve />
Cela donne la trace d'exécution suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0
[ivy:resolve] confs: [default]
[ivy:resolve] found commons-lang#commons-lang;2.6 in public
[ivy:resolve] found commons-io#commons-io;2.4 in public
[ivy:resolve] found org.springframework#spring-aop;3.2.4.RELEASE in public
[ivy:resolve] found aopalliance#aopalliance;1.0 in public
[ivy:resolve] found org.springframework#spring-beans;3.2.4.RELEASE in public
[ivy:resolve] found org.springframework#spring-core;3.2.4.RELEASE in public
[ivy:resolve] found org.aspectj#aspectjweaver;1.7.2 in public
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ...
[ivy:resolve] ............................ (364kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (892ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ...
[ivy:resolve] .................. (277kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (666ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ...
[ivy:resolve] .............................................
[ivy:resolve] ........................ (1585kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2596ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar ...
[ivy:resolve] ........................ (240kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar(source) (645ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar ...
[ivy:resolve] ................................ (180kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar (540ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-javadoc.jar ...
[ivy:resolve] ........................................... (707kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar(javadoc) (1490ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE-sources.jar ...
[ivy:resolve] .................................. (318kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar(source) (765ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE-javadoc.jar ...
[ivy:resolve] ........................................................ (768kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar(javadoc) (1384ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-aop/3.2.4.RELEASE/spring-aop-3.2.4.RELEASE.jar ...
[ivy:resolve] .................................. (327kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.springframework#spring-aop;3.2.4.RELEASE!spring-aop.jar (746ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.jar ...
[ivy:resolve] .. (4kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] aopalliance#aopalliance;1.0!aopalliance.jar (307ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-beans/3.2.4.RELEASE/spring-beans-3.2.4.RELEASE.jar ...
[ivy:resolve] .......................................... (593kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.springframework#spring-beans;3.2.4.RELEASE!spring-beans.jar (1134ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/springframework/spring-core/3.2.4.RELEASE/spring-core-3.2.4.RELEASE.jar ...
[ivy:resolve] ................................................. (849kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.springframework#spring-core;3.2.4.RELEASE!spring-core.jar (1536ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/org/aspectj/aspectjweaver/1.7.2/aspectjweaver-1.7.2.jar ...
[ivy:resolve] .........................................
[ivy:resolve] ...................... (1785kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] org.aspectj#aspectjweaver;1.7.2!aspectjweaver.jar (2957ms)
[ivy:resolve] :: resolution report :: resolve 6350ms :: artifacts dl 15693ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 7 | 7 | 7 | 0 || 13 | 13 |
---------------------------------------------------------------------
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.
2.
3.
<
ivy
:
resolve>
<
ivy
:
dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</
ivy
:
resolve>
Cela donne la trace d'exécution suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:resolve] :: resolving dependencies :: #;working@R-PC
[ivy:resolve] confs: [default]
[ivy:resolve] found commons-lang#commons-lang;2.6 in public
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ...
[ivy:resolve] ......................... (364kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (983ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ...
[ivy:resolve] .................................................
[ivy:resolve] .......... (1585kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (2602ms)
[ivy:resolve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ...
[ivy:resolve] ............................... (277kB)
[ivy:resolve] .. (0kB)
[ivy:resolve] [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (775ms)
[ivy:resolve] :: resolution report :: resolve 2274ms :: artifacts dl 4370ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 1 | 1 | 0 || 3 | 3 |
---------------------------------------------------------------------
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 :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:resolve] :: resolving dependencies :: #;working@R-PC
[ivy:resolve] confs: [default]
[ivy:resolve] found commons-lang#commons-lang;2.6 in public
[ivy:resolve] :: resolution report :: resolve 131ms :: artifacts dl 4ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 3 | 0 |
---------------------------------------------------------------------
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 :
2.
3.
4.
5.
6.
<
ivy
:
resolve>
<
ivy
:
dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</
ivy
:
resolve>
<
ivy
:
retrieve>
<
ivy
:
dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</
ivy
:
retrieve>
Provoque cette trace :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:resolve] :: resolving dependencies :: #;working@R-PC
[ivy:resolve] confs: [default]
[ivy:resolve] found commons-lang#commons-lang;2.6 in public
[ivy:resolve] :: resolution report :: resolve 107ms :: artifacts dl 3ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 3 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: #
[ivy:retrieve] confs: [default]
[ivy:retrieve] 0 artifacts copied, 3 already retrieved (0kB/3ms)
Tandis que le code suivant :
2.
3.
<
ivy
:
retrieve>
<
ivy
:
dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</
ivy
:
retrieve>
Provoque cette trace :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[ivy:retrieve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:retrieve] :: resolving dependencies :: #;working@R-PC
[ivy:retrieve] confs: [default]
[ivy:retrieve] found commons-lang#commons-lang;2.6 in public
[ivy:retrieve] :: resolution report :: resolve 105ms :: artifacts dl 4ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 3 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: #
[ivy:retrieve] confs: [default]
[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 :
<
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 :
2.
3.
4.
[ivy:report] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:report] Processing C:\Users\R\.ivy2\cache\com.developpez-mon-module-default.xml to D:\workspaceKep\Ivy\com.developpez-mon-module-default.html
[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 - 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 :
2.
<
ivy
:
cachepath
pathid
=
"classcache"
/>
<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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[ivy:cachepath] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:cachepath] :: resolving dependencies :: com.developpez#mon-module;1.0
[ivy:cachepath] confs: [default]
[ivy:cachepath] found commons-lang#commons-lang;2.6 in public
[ivy:cachepath] found commons-io#commons-io;2.4 in public
[ivy:cachepath] found org.springframework#spring-aop;3.2.4.RELEASE in public
[ivy:cachepath] found aopalliance#aopalliance;1.0 in public
[ivy:cachepath] found org.springframework#spring-beans;3.2.4.RELEASE in public
[ivy:cachepath] found org.springframework#spring-core;3.2.4.RELEASE in public
[ivy:cachepath] found org.aspectj#aspectjweaver;1.7.2 in public
[ivy:cachepath] :: resolution report :: resolve 201ms :: artifacts dl 17ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 7 | 0 | 0 | 0 || 13 | 0 |
---------------------------------------------------------------------
[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.
<
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 :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"mon-module"
revision
=
"1.0"
status
=
"integration"
>
</info>
<publications>
<artifact />
<artifact
name
=
"mon-module"
type
=
"source"
ext
=
"jar"
e
:
classifier
=
"source"
/>
</publications>
<dependencies>
<dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</dependencies>
</ivy-module>
Et que le fichier build.xml contient les tâches suivantes :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<!-- Copie des dépendances dans le dossier lib et compilation -->
<
ivy
:
retrieve />
<javac
srcdir
=
"src"
destdir
=
"bin"
includeantruntime
=
"false"
>
<classpath>
<fileset
dir
=
"lib"
includes
=
"*.jar"
/>
</classpath>
</javac>
<!-- Génération des jars à publier -->
<jar
destfile
=
"build/jar/${ivy.module}-${ivy.revision}.jar"
basedir
=
"bin"
/>
<jar
destfile
=
"build/source/${ivy.module}-${ivy.revision}-source.jar"
basedir
=
"src"
/>
<!-- Publication dans le dépôt local -->
<
ivy
:
publish
resolver
=
"local"
>
<
ivy
:
artifacts
pattern
=
"build/[type]/[artifact]-[revision](-[classifier]).[ext]"
/>
</
ivy
:
publish>
À l'exécution cela donne la trace suivante.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
[ivy:retrieve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[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
[ivy:retrieve] :: resolving dependencies :: com.developpez#mon-module;1.0
[ivy:retrieve] confs: [default]
[ivy:retrieve] found commons-lang#commons-lang;2.6 in default
[ivy:retrieve] :: resolution report :: resolve 100ms :: artifacts dl 5ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 3 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: com.developpez#mon-module
[ivy:retrieve] confs: [default]
[ivy:retrieve] 0 artifacts copied, 3 already retrieved (0kB/46ms)
[jar] Building jar: D:\workspaceKep\Module\build\jar\mon-module-1.0.jar
[jar] Building jar: D:\workspaceKep\Module\build\source\mon-module-1.0-source.jar
[ivy:publish] :: delivering :: com.developpez#mon-module;1.0 :: 1.0 :: integration :: Sun Aug 25 20:09:17 CEST 2013
[ivy:publish] delivering ivy file to D:\workspaceKep\Module\build\ivy\ivy-1.0.xml
[ivy:publish] :: publishing :: com.developpez#mon-module
[ivy:publish] published mon-module to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\jars\mon-module.jar
[ivy:publish] published mon-module to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\sources\mon-module.jar
[ivy:publish] published ivy to C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part\ivys\ivy.xml
[ivy:publish] publish commited: moved C:\Users\R\.ivy2\local\com.developpez\mon-module\1.0.part
[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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<ivysettings>
<include
url
=
"${ivy.default.settings.dir}/ivysettings.xml"
/>
<credentials
host
=
"localhost"
realm
=
"Sonatype Nexus Repository Manager"
username
=
"deployment"
passwd
=
"deployment123"
/>
<resolvers>
<ibiblio
name
=
"depotPrive"
m2compatible
=
"true"
root
=
"http://localhost:8080/nexus/content/repositories/releases/"
/>
</resolvers>
</ivysettings>
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
:
e
=
"http://ant.apache.org/ivy/extra"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"mon-module"
revision
=
"1.0"
status
=
"integration"
>
</info>
<publications>
<artifact />
<artifact
name
=
"mon-module"
type
=
"source"
ext
=
"jar"
e
:
classifier
=
"source"
/>
<artifact
name
=
"mon-module"
type
=
"pom"
/>
</publications>
<dependencies>
<dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
</dependencies>
</ivy-module>
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<
ivy
:
resolve />
<!-- Création des artifacts et du fichier POM -->
<jar
destfile
=
"build/jar/${ivy.module}-${ivy.revision}.jar"
basedir
=
"bin"
/>
<jar
destfile
=
"build/source/${ivy.module}-${ivy.revision}-source.jar"
basedir
=
"src"
/>
<
ivy
:
makepom
ivyfile
=
"ivy.xml"
pomfile
=
"build/pom/${ivy.module}-${ivy.revision}.pom"
/>
<!-- Publication -->
<
ivy
:
publish
resolver
=
"depotPrive"
publishivy
=
"false"
>
<
ivy
:
artifacts
pattern
=
"build/[type]/[artifact]-[revision](-[classifier]).[ext]"
/>
</
ivy
:
publish>
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[ivy:resolve] :: loading settings :: file = D:\workspaceKep\Module\ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.developpez#mon-module;1.0
[ivy:resolve] confs: [default]
[ivy:resolve] found commons-lang#commons-lang;2.6 in default
[ivy:resolve] :: resolution report :: resolve 88ms :: artifacts dl 3ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 1 | 0 | 0 | 0 || 3 | 0 |
---------------------------------------------------------------------
[jar] Building jar: D:\workspaceKep\Module\build\jar\mon-module-1.0.jar
[jar] Building jar: D:\workspaceKep\Module\build\source\mon-module-1.0-source.jar
[ivy:publish] :: publishing :: com.developpez#mon-module
[ivy:publish] published mon-module to http://localhost:8080/nexus/content/repositories/releases/com/developpez/mon-module/1.0/mon-module-1.0.jar
[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
[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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"test-incluant"
revision
=
"2.0"
status
=
"integration"
>
</info>
<dependencies>
<dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.6"
/>
<dependency
org
=
"commons-io"
name
=
"commons-io"
rev
=
"2.0"
/>
<dependency
org
=
"com.developpez"
name
=
"test-inclus"
rev
=
"1.0"
/>
<dependency
org
=
"com.developpez"
name
=
"test-pom"
rev
=
"1.5"
/>
</dependencies>
</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.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module
version
=
"2.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info
organisation
=
"com.developpez"
module
=
"test-inclus"
revision
=
"1.0"
status
=
"integration"
>
</info>
<dependencies>
<dependency
org
=
"commons-lang"
name
=
"commons-lang"
rev
=
"2.4"
/>
</dependencies>
</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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
schemaLocation
=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
com.developpez</groupId>
<artifactId>
test-pom</artifactId>
<version>
1.5</version>
<dependencies>
<dependency>
<groupId>
commons-lang</groupId>
<artifactId>
commons-lang</artifactId>
<version>
2.0</version>
</dependency>
</dependencies>
</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.