2011-06-08 6 views
9

Dans un grand projet Maven 2, il est intéressant d'avoir la gestion des dépendances pour s'assurer qu'une seule version d'une dépendance est utilisée dans tout le système. Cela rend le système cohérent. Mais lorsque je génère des POM efficaces, je n'ai aucune chance de voir d'où proviennent les versions de dépendances. De même, dans un POM en haut de la hiérarchie, je n'ai aucune idée de l'endroit où, dans les POM enfants, les versions définies de la section de gestion des dépendances sont réellement utilisées.Nettoyage de la gestion des dépendances Maven

Alors, comment conserver la gestion des dépendances nettoyée? Quand je supprime une dépendance dans un projet, je vérifie toujours dans tous les autres projets s'il est toujours nécessaire, de sorte que je peux également retirer de la gestion des dépendances au sommet?

En outre, comment puis-je créer la gestion des dépendances, en vérifiant qu'il n'est pas dupliqué quelque part dans les POM enfants? Lorsque j'ajoute des dépendances, je vérifie toujours tous les autres projets pour voir s'il peut être agrégé en haut dans la gestion des dépendances? Ou voulez-vous toujours déplacer toutes les versions de dépendance vers le haut depuis le début afin qu'elles soient toujours dans un seul endroit?

Merci pour vos commentaires.

+0

Une autre idée que je viens d'avoir: pourquoi ne pas utiliser le même numéro de version dans tous les modules, et compter sur $ {} project.version aussi souvent que possible. Idéalement, je n'ai que le numéro de version dans le POM supérieur et j'utilise la variable partout ailleurs. Comme ça je n'ai pas du tout besoin de gestion des dépendances, toutes les versions de dépendances internes sont directement spécifiées avec la variable. – anselm

Répondre

2

Si vous utilisez eclipse, le plugin m2eclipe vous permet d'afficher la hiérarchie des dépendances pour vous pom. Cela peut être très utile lorsque vous essayez de déterminer où les dépendances sont introduites dans votre projet et où des conflits se produisent.

1

Vous devez déclarer explicitement les dépendances dans les projets dans lesquels ils sont utilisés, sauf si elle est utilisée dans TOUS les projets. Si, par exemple, Spring est utilisé pour tous vos projets, mettez-le dans le POM parent. S'il n'est utilisé que dans certains projets, déclarez-le dans chacun d'entre eux et placez une propriété spring.version dans le parent que chaque enfant pom peut utiliser pour sa version. Le déplacement de toutes les dépendances vers le parent supprime la responsabilité de chaque projet pour gérer ses propres dépendances. Je considérerais cela comme une mauvaise utilisation de maven car cela rend les choses plus difficiles à maintenir plutôt que plus faciles. Il ajoute maintenant des dépendances aux projets qui n'en ont pas besoin. Souvent, la portée d'une dépendance est également différente pour les projets, et vous ne pouvez pas gérer cela si vous ne déclarez pas vos dépendances localement.

+0

Je ne vois pas la différence entre spécifier la version dans la gestion des dépendances ou dans une propriété. Le fait de ne pas déplacer les dépendances vers la gestion des dépendances parente présente l'inconvénient de répartir le numéro de version sur l'ensemble de vos POM, ce qui se traduit facilement par la présence de plusieurs versions d'une dépendance dans l'ensemble de l'application. – anselm

+0

C'est pourquoi vous utilisez une propriété. Vos dépendances sont ensuite gérées localement au projet, mais la propriété définit la version acceptée à utiliser. Le seul inconvénient est que toute personne ajoutant un pom enfant doit être conscient de l'existence de ces propriétés et les utiliser de manière appropriée. Ceci est encore préférable à votre proposition qui consiste à donner à chaque projet toutes les dépendances les dépendances de tous les autres projets. Cela vous oblige également à les définir tous en tant que compilation. – Robin

8

Vous pouvez créer un ou plusieurs boms (nomenclature) pour votre projet. Ces pom.xmls vont déclarer toutes les dépendances utilisées dans votre projet dans la section dependencyManagement.

Dans chaque pom enfant, vous devez importer ces boms et utiliser les dépendances requises pour le projet. De cette manière, les versions de dépendances sont gérées de manière centralisée, tandis que dans le même temps, chaque enfant pom utilise uniquement les dépendances dont il a besoin.

Voir Importing Managed Dependencies

projet de nomenclature

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.group</groupId> 
    <artifactId>My-Project-Bom</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
     <version>1.7.0</version> 
     </dependency> 
     ... 
    </dependencies> 
    </dependencyManagement> 
</project> 

projet enfant

<project> 
<modelVersion>4.0.0</modelVersion> 
<groupId>my.group</groupId> 
<artifactId>child1</artifactId> 
<packaging>jar</packaging> 
<name>Child1</name> 
<version>1.0</version> 
<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>my.group</groupId> 
     <artifactId>My-Project-BOM</artifactId> 
     <version>1.0</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 
<dependencies> 
    <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
    </dependency> 
</dependencies> 
... 
</project> 

maven dependency plugin a quelques objectifs pour vous aider à obtenir la hiérarchie de dépendance.

mvn dependency:list 
mvn dependency:tree 
mvn dependency:analyze 
+0

Bonne idée que je ne connaissais pas. Mais puisque nous avons un POM de niveau supérieur dont tous les autres POM sont des enfants, je pourrais simplement utiliser la gestion des dépendances ici. Je ne vois toujours pas comment cela résoudrait le problème du nettoyage de la gestion des dépendances. Le problème à l'intérieur d'une nomenclature serait le même. – anselm

+0

Je n'ai jamais connu cette approche. Je l'aime car il vous donne le contrôle sur le versionnement mais les dépendances sont toujours déclarées là où elles sont requises avec une portée appropriée. Aussi facile à utiliser une version spécifique si nécessaire. – Robin

+0

Lien similaire [Existe-t-il un moyen simple de supprimer les dépendances inutilisées d'un maven pom.xml? - Stack Overflow] (http://stackoverflow.com/questions/1517611/-there-a-simple-way-to-remove-unused-dependencies-from-a-maven-pom-xml) –

0

Vous pouvez obtenir le POM POM aux dépendances, et le code des références qui les provoquent, en utilisant le Structure101composition perspective. Créez un nouveau projet s101, tapez Maven, spécifiez le fichier pom.xml racine, terminez (utilisez les valeurs par défaut pour le reste de l'assistant), puis sélectionnez la perspective de composition (2ème bouton sur la barre d'outils verticale en haut à gauche de l'interface utilisateur) et verra quelque chose comme ceci:

Structure101 POM dependency graph

Questions connexes