Différences entre la gestion de la dépendance et les dépendances dans Maven

Quelle est la différence entre dependencyManagement et dependencies ? J'ai vu les docs sur le site D'Apache Maven. Il semble qu'une dépendance définie sous le dependencyManagement puisse être utilisée dans ses modules enfants sans spécifier la version.

par exemple:

un projet parent (Pro-par) définit une dépendance sous le dependencyManagement :

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

alors 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 définir directement dans le module nécessaire?

526
demandé sur M. Justin 2010-04-12 06:43:16

9 réponses

gestion de dépendances permet de consolider et de centraliser la gestion des versions de dépendances sans ajouter de dépendances 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 artéfacts utilisés dans les dépendances transitives. Ce est difficile à expliquer sans exemple. Heureusement, ceci est illustré dans la documentation.

335
répondu Pascal Thivent 2010-04-12 03:31:11

je suis à la mode en retard à cette question, mais je pense qu'il vaut la peine d'une réponse plus claire que celle acceptée (ce qui est correct, mais ne met pas l'accent sur la partie importante réelle, que vous devez déduire vous-même).

dans le POM parent, la principale différence entre le <dependencies> et <dependencyManagement> est la suivante:

artéfacts spécifiés dans la section <dependencies> sera TOUJOURS inclus en tant que dépendance de l'enfant module(s).

Les artéfacts

spécifiés dans la section <dependencyManagement> ne seront inclus dans le module enfant que s'ils sont également spécifiés dans la section <dependencies> du module enfant lui-même. Pourquoi est-ce bien que tu demandes? parce que vous spécifiez la version et/ou la portée dans le parent, et vous pouvez les laisser en dehors lorsque vous spécifiez les dépendances dans le POM enfant. Cela peut aider vous utilisez des versions unifiées pour les dépendances pour les modules enfants, sans spécifier la version dans chaque module enfant.

429
répondu dcoder 2016-05-17 16:04:49

c'est comme vous l'avez dit; dependencyManagement est utilisé pour extraire toutes les informations de dépendances dans un fichier commun POM, simplifiant les références dans le fichier child POM.

il devient utile lorsque vous avez plusieurs attributs que vous ne voulez pas retaper sous plusieurs projets enfants.

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

43
répondu Pran 2010-04-12 03:08:45

la documentation sur le site de Maven est horrible. Ce que dependencyManagement fait est simplement de déplacer vos définitions de dépendances (version, exclusions, etc) vers le pom parent, puis dans le poms enfant vous avez juste à mettre le groupide et artifactId. C'est tout (sauf pour parent pom chaining et autres, mais ce n'est pas vraiment compliqué non plus - dependencyManagement gagne sur les dépendances au niveau parent - mais si vous avez une question à ce sujet ou des importations, la documentation Maven est un peu meilleure).

après avoir lu tous les déchets 'a', 'b', 'c' sur le site de Maven et avoir été confus, j'ai réécrit leur exemple. Donc si vous aviez 2 projets (proj1 et proj2) qui partagent une dépendance commune (betaShared), vous pourriez déplacer cette dépendance jusqu'à la pom du parent. Pendant que vous y êtes, vous pouvez également passer toutes les autres dépendances (alpha et charlie), mais seulement si elle fait sens pour votre projet. Ainsi, pour la situation décrite dans phrases précédentes, voici la solution avec dependencyManagement dans le pom parent:

<!-- ParentProj pom -->
<project>
  <dependencyManagement>
    <dependencies>
      <dependency> <!-- not much benefit defining alpha here, as we only use in 1 child, so optional -->
        <groupId>alpha</groupId>
        <artifactId>alpha</artifactId>
        <version>1.0</version>
        <exclusions>
          <exclusion>
            <groupId>zebra</groupId>
            <artifactId>zebra</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>charlie</groupId> <!-- not much benefit defining charlie here, so optional -->
        <artifactId>charlie</artifactId>
        <version>1.0</version>
        <type>war</type>
        <scope>runtime</scope>
      </dependency>
      <dependency> <!-- defining betaShared here makes a lot of sense -->
        <groupId>betaShared</groupId>
        <artifactId>betaShared</artifactId>
        <version>1.0</version>
        <type>bar</type>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

<!-- Child Proj1 pom -->
<project>
  <dependencies>
    <dependency>
      <groupId>alpha</groupId>
      <artifactId>alpha</artifactId>  <!-- jar type IS DEFAULT, so no need to specify in child projects -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId>
      <artifactId>betaShared</artifactId>
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>

<!-- Child Proj2 -->
<project>
  <dependencies>
    <dependency>
      <groupId>charlie</groupId>
      <artifactId>charlie</artifactId>
      <type>war</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId> 
      <artifactId>betaShared</artifactId> 
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>
39
répondu MattC 2016-08-25 03:39:33

il y a encore une chose qui n'est pas assez mise en évidence, à mon avis, et c'est héritage indésirable .

voici un exemple progressif:

je déclare dans mon parent pom:

<dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>
</dependencies>

boom! Je l'ai dans mes modules Child A , Child B et Child C :

  • Implicilty héritée par l'enfant poms
  • un seul endroit pour gérer
  • Pas besoin de redeclare rien de l'enfant poms
  • je peux encore changer de nom et remplacer version 18.0 dans un Child B si je le veux.

mais que se passe-t-il si je n'ai pas besoin de goyave dans Child C , ni dans le futur Child D et Child E modules?

ils en hériteront encore et cela n'est pas désiré! C'est tout comme Java God Object code smell, où vous héritez de quelques bits utiles d'une classe, et une tonne de choses indésirables ainsi.

c'est ici que <dependencyManagement> entre en jeu. Lorsque vous ajoutez cela à votre pom parent, tous les modules de votre enfant STOP seeing it . Et donc vous êtes forcé d'aller dans chaque module individuel qui en a besoin et le déclarer à nouveau ( Child A et Child B , sans la version bien.)

Et, évidemment, vous ne le font pas pour Child C , et donc votre module reste maigre.

11
répondu Andrejs 2017-12-17 11:27:41

Si la dépendance est définie dans le pom du dependencyManagement élément, le projet enfant n'a pas à mentionner la version de la dépendance. si le projet enfant définissait une version, il supplanterait la version listée au niveau supérieur La section Gestion de la dépendance de POM. C'est-à-dire que la version dependencyManagement utilisé lorsque l'enfant ne déclare pas une version directement.

8
répondu Mustafa Güven 2014-02-11 14:18:19

il y a quelques réponses soulignant les différences entre <depedencies> et <dependencyManagement> tags avec maven.

cependant, peu de points développés ci-dessous d'une manière concise:

  1. <dependencyManagement> permet de consolider toutes les dépendances (utilisées au niveau de la pom enfant) utilisées à travers différents modules -- clarté , gestion de la version de la dépendance centrale
  2. <dependencyManagement> permet de facilement mettre à niveau/déclasser les dépendances en fonction des besoins, dans d'autres scénarios cela doit être exercé au niveau de chaque pom enfant -- consistency 1519170920"
  3. dépendances <dependencies> tag est toujours importés, tandis que les dépendances fourni à <dependencyManagement> dans le pom parent sera importé uniquement si l'enfant pom est entrée dans sa <dependencies> tag.
7
répondu Amit Kaneria 2018-05-22 11:20:40

dans le POM parent, la principale différence entre le <dependencies> et <dependencyManagement> est la suivante:

Les artéfacts

spécifiés dans la section <dependencies> seront toujours inclus comme une dépendance du(DES) module (s) enfant (s).

Les artéfacts

spécifiés dans la section, ne seront inclus dans le module enfant que s'ils sont également spécifiés dans la section du module enfant lui-même. Pourquoi est-ce bien que tu demandes? parce que vous spécifiez la version et / ou la portée dans le parent, et vous pouvez les laisser en dehors lorsque vous spécifiez les dépendances dans la POM enfant. Cela peut vous aider à utiliser les versions unifiées pour les dépendances pour les modules enfants, sans spécifier la version dans chaque module enfant.

3
répondu Yaver 2018-01-10 02:40:14

dans Eclipse, il y a une caractéristique supplémentaire dans le dependencyManagement . Quand dependencies est utilisé sans lui, les dépendances non-trouvées sont noté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 n'apparaissent que dans les fichiers java. (importations et ces...)

1
répondu Gangnus 2017-01-06 14:47:12