970 votes

Différences entre dependencyManagement et dépendances dans Maven

Quelle est la différence entre dependencyManagement y dependencies ? J'ai consulté la documentation sur le site Web d'Apache Maven. Il semble qu'une dépendance définie sous le nom de dependencyManagement peut être utilisé dans ses modules enfants sans spécifier la version.

Par exemple :

Un projet parent (Pro-par) définit une dépendance sous la rubrique dependencyManagement :

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8</version>
    </dependency>
 </dependencies>
</dependencyManagement>

Ensuite, dans l'enfant de Pro-par, je peux utiliser le junit :

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
 </dependencies>

Cependant, je me demande s'il est nécessaire de définir junit dans le pom parent ? Pourquoi ne pas le définir directement dans le module nécessaire ?

555voto

Pascal Thivent Points 295221

Gestion des dépendances permet de consolider et de centraliser la gestion des versions de dépendances sans ajouter de dépendances qui sont héritées par tous les enfants. Ceci est particulièrement utile lorsque vous avez un ensemble de projets (c'est-à-dire plus d'un) qui hérite d'un parent commun.

Un autre cas d'utilisation extrêmement important de dependencyManagement est le contrôle des versions des artefacts utilisés dans les dépendances transitives. C'est difficile à expliquer sans un exemple. Heureusement, cela est illustré dans la documentation.

21 votes

Donc, son besoin de déclarer les dépendances dans les pom's du projet enfant de toute façon même si elles sont déclarées dans le pom's du projet parent à la section <dependencyManagement> ? Est-il possible de faire une sorte d'héritage des dépendances ?

73 votes

Oui, vous devez toujours les définir dans le POM enfant pour montrer que vous les utilisez. Ils ne sont pas réellement inclus dans les projets enfants, simplement parce qu'ils sont dans la section <dependencyManagement> dans le POM parent. Enfermer les dépendances dans <dependencyManagement> centralise la gestion de la version, de la portée et des exclusions pour chaque dépendance, si et quand vous décidez de l'utiliser. L'interface de Maven guide de la gestion des dépendances entre dans tous les détails.

3 votes

Le deuxième paragraphe ( dependencyManagement contrôle également les dépendances transitives) n'est vraie que lorsque les dépendances sont explicitement définies : stackoverflow.com/questions/28312975/

47voto

Pran Points 1240

C'est comme tu l'as dit ; dependencyManagement est utilisé pour rassembler toutes les informations sur les dépendances dans un fichier POM commun, ce qui simplifie les références dans le fichier POM enfant.

Elle devient utile lorsque vous avez plusieurs attributs que vous ne voulez pas retaper dans le cadre de plusieurs projets enfants.

Enfin, dependencyManagement peut être utilisé pour définir une version standard d'un artefact à utiliser dans plusieurs projets.

6 votes

Donc, les dépendances ne sont pas héritées ? Elles doivent être déclarées dans le pom du projet enfant de toute façon ?

11 votes

Oui, vous devez de toute façon les déclarer dans les projets enfants, mais sans spécifier de version.

0 votes

Ce scénario est utile lorsque vous voulez avoir une gouvernance des versions dans plusieurs projets java ayant une relation parent-enfant.

13voto

Mustafa Güven Points 2316

Si la dépendance était définie dans l'élément dependencyManagement du pom de niveau supérieur, le projet enfant n'avait pas besoin de lister explicitement la version de la dépendance. Si le projet enfant définissait une version, elle remplacerait la version listée dans la section dependencyManagement du pom de niveau supérieur. POM de niveau supérieur. En d'autres termes, la version de dependencyManagement est seulement utilisée que lorsque le projet enfant ne déclare pas directement une version.

1 votes

Je crois que cette affirmation n'est peut-être pas correcte. Dans les exemples de gestion des dépendances de Maven (#2), il est dit que les dépendances définies dans un pom parent avec une version, remplaceront la version spécifiée dans le pom enfant : "Lorsque maven est exécuté sur le projet B, la version 1.0 des artefacts a, b, c, et d sera utilisée indépendamment de la version spécifiée dans leur pom".

0 votes

@devdanke Au moins, Eclipse m2e émet un avertissement : Remplacement de la version gérée ... pour ... .

1voto

Gangnus Points 7646

Dans Eclipse, il y a une fonctionnalité supplémentaire dans l'onglet dependencyManagement . Quand dependencies est utilisé sans lui, les dépendances non trouvées sont remarquées dans le fichier pom. Si dependencyManagement est utilisé, les dépendances non résolues restent inaperçues dans le fichier pom et les erreurs apparaissent uniquement dans les fichiers java. (imports et autres...)

0 votes

Qu'est-ce qu'une dépendance non résolue ?

0 votes

@KorayTugay "non résolu", bien sûr, merci pour votre avis. Modifié.

-4voto

Harsh Gupta Points 19

Si vous avez des cas de test JUnit définis dans tous les modules enfants et que vous utilisez STS ou eclipse, eclipse donnera des erreurs pour les cas de test si vous ne faites que les définir.

Vous devez ajouter les dépendances pour junit outside tag dans le module parent, afin de ne pas avoir d'erreurs pour les cas de test dans eclipse. Bien que maven compilera toujours sans avoir ce genre de tag.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X