vendredi 14 novembre 2008

Maven et les dépendances transitives

Une des évolutions de maven2 par rapport à maven1 concerne la gestion de dépendances transitives : La définition d'une dépendance au niveau d'un projet entraîne la récupération des dépendances de cette dépendance et ainsi de suite...

Sur de gros projets, la gestion des dépendances avec Maven est quasiment indispensable. J'ai même dû mal à comprendre qu'on puisse faire sans.

Avec les dépendances transitives, on se retrouve vite à récupérer la terre entière et à avoir des dépendances qui utilisent des dépendances transitives communes mais dans des versions différentes...

On voit apparaître des exceptions du type "NoClassDefFoundError" à l'exécution et c'est là que le casse tête commence...

Voici ce que j'utilise pour résoudre ce genre de problème :
  • la commande du plugin maven "dependency" pour découvrir les dépendances en double :
    mvn dependency:tree
  • La mise en place de tags d'exclusion au niveau des pom.xml pour permettre de définir une dépendance mais d'exclure certaines de ces dépendances transitives :
    <dependency>
    <groupId>yourDependencyGroupId</groupId>
    <artifactId>yourDependencyArtifactId</artifactId>
    <version>yourDependencyVersion</version>
    <exclusions>
    <exclusion>
    <groupId>ExcludedTransitiveDependencyGroupId</groupId>
    <artifactId>ExcludedTransitiveDependencyArtifactId</artifactId>
    </exclusion>
    </exclusions>
    </dependency>

1 commentaire:

Thierry Bressure a dit…

La gestion des dépendences transitive est un réel apport de maven 2. Le fait que cela engendre des problèmes ne fait que mettre en exergue une situation latente.
La solution d'exclure certaines branches de transitivité est un choix qui nécessite de prendre en comptes les besoins de toutes les dépendences afin de trouver un ensemble stable. Mais la solution idéale serait de ne pas avoir à toucher les dépendences transitives en mettant à jour les différentes librairies tierces. Si cela n'est pas possible ela veut dire que l'ensemble des librairies tierces doit être "packagés" différement (peut-être avec JPF : Java Plugin Framework): J2EE n'etant pas la seule façon de "packager" les applications.