Quelle est la difference entre dependencyManagement
et dependencies
? J'ai vu les documents sur le site Web 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 dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
Puis chez l'enfant de Pro-par, je peux utiliser la 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?
<dependencyManagement>
dans le POM parent. Le fait d'inclure des dépendances dans<dependencyManagement>
centralise la gestion de la version, de la portée et des exclusions de chaque dépendance, si et quand vous décidez de l'utiliser. Le guide de Maven sur la gestion des dépendances entre dans tous les détails.dependencyManagement
contrôle également les dépendances transitives) n'est vrai que lorsque les dépendances sont explicitement définies: stackoverflow.com/questions/28312975/…dependencies
section dans votre pom parent. Nous l'avons fait pour que tous les projets enfants aient des apache-commons par défaut et pour ne pas les déclarer tout le temps.Je suis à la mode en retard à cette question, mais je pense que cela vaut 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 vous déduire).
Dans le POM parent, la principale différence entre le
<dependencies>
et<dependencyManagement>
est la suivante:Les artefacts spécifiés dans la
<dependencies>
section seront TOUJOURS inclus en tant que dépendance du ou des modules enfants.Les artefacts spécifiés dans la
<dependencyManagement>
section ne seront inclus dans le module enfant que s'ils ont également été spécifiés dans la<dependencies>
section du module enfant lui-même. Pourquoi est-il bon de demander car vous spécifiez la version et / ou la portée dans le parent et vous pouvez les laisser de côté lorsque vous spécifiez les dépendances dans le POM enfant. Cela peut vous aider à utiliser des versions unifiées pour les dépendances des modules enfants, sans spécifier la version dans chaque module enfant.la source
<dependencyManagement>
over<dependencies>
dans la racine.pom
? Les enfantspom
pourraient être beaucoup plus courts.Artifacts specified in the <dependencies> section will ALWAYS be included as a dependency of the child module(s)
qu'ils sont également inclus dans le parent. Il semble impossible de définir une dépendance pour les enfants, mais pas pour le parent.La documentation sur le site Maven est horrible. Ce que dependencyManagement fait, c'est simplement déplacer vos définitions de dépendances (version, exclusions, etc.) vers le pom parent, puis dans les poms enfants, il vous suffit de mettre groupId et artifactId. C'est tout (sauf pour le chaînage de pom parent et autres, mais ce n'est pas vraiment compliqué non plus - dependencyManagement l'emporte sur les dépendances au niveau parent - mais si vous avez une question à ce sujet ou importe, la documentation Maven est un peu meilleure).
Après avoir lu toutes les ordures «a», «b», «c» sur le site de Maven et être confus, j'ai réécrit leur exemple. Donc, si vous aviez 2 projets (proj1 et proj2) qui partagent une dépendance commune (betaShared), vous pouvez déplacer cette dépendance vers le pom parent. Pendant que vous y êtes, vous pouvez également déplacer vers le haut toutes les autres dépendances (alpha et charlie) mais uniquement si cela a du sens pour votre projet. Donc, pour la situation décrite dans les phrases précédentes, voici la solution avec dependencyManagement dans le pom parent:
la source
C'est comme vous l'avez dit;
dependencyManagement
est utilisé pour extraire toutes les informations de dépendance dans un fichier POM commun, simplifiant les références dans le fichier POM enfant.Cela devient utile lorsque vous avez plusieurs attributs que vous ne souhaitez pas retaper dans plusieurs projets enfants.
Enfin,
dependencyManagement
peut être utilisé pour définir une version standard d'un artefact à utiliser dans plusieurs projets.la source
Il y a encore une chose qui n'est pas suffisamment mise en évidence, à mon avis, et c'est l' héritage indésirable .
Voici un exemple incrémentiel:
Je déclare dans mon
parent
pom:boom! Je l' ai dans mes
Child A
,Child B
etChild C
modules:version 18.0
unChild B
si je veux.Mais que se passe-t-il si je finis par ne pas avoir besoin de goyave
Child C
, ni à l'avenirChild D
ni deChild E
modules?Ils en hériteront toujours et ce n'est pas souhaité! C'est exactement comme l'odeur du code Java God Object, où vous héritez de quelques bits utiles d'une classe, ainsi que d'une tonne de choses indésirables.
C'est là
<dependencyManagement>
qu'entre en jeu. Lorsque vous ajoutez cela à votre pom parent, tous vos modules enfants ARRÊTENT de le voir . Et donc vous êtes obligé d'aller dans chaque module individuel qui en a besoin et de le déclarer à nouveau (Child A
etChild B
, sans la version cependant).Et, évidemment, vous ne le faites pas pour
Child C
, et donc votre module reste léger.la source
<dependencyManagement>
dans le pom parent, par défaut, les dépendances ne seront pas héritées dans les poms enfants? Parce que dans le doc: maven.apache.org/guides/introduction/… tout en expliquant la deuxième utilisation du<dependencyManagement>
il semble qu'il sera hérité par défaut. Sur une ligne, ils disent que: "Lorsque maven est exécuté sur le projet B, la version 1.0 des artefacts a, b, c et d sera utilisée quelle que soit la version spécifiée dans leur pom" même si "b" n'est pas utilisé dans le projet BIl y a quelques réponses décrivant les différences entre
<depedencies>
et les<dependencyManagement>
balises avec maven.Cependant, quelques points développés ci-dessous de manière concise:
<dependencyManagement>
permet de consolider toutes les dépendances (utilisées au niveau du pom enfant) utilisées sur différents modules - clarté , gestion centralisée des versions des dépendances<dependencyManagement>
permet de mettre à niveau / rétrograder facilement les dépendances en fonction des besoins, dans un autre scénario, cela doit être exercé à chaque niveau de pom enfant - cohérence<dependencies>
balise sont toujours importées, tandis que les dépendances fournies<dependencyManagement>
dans le parent pom ne seront importées que si le pom enfant a une entrée respective dans sa<dependencies>
balise.la source
Désolé, je suis très en retard à la fête.
Permettez-moi d'essayer d'expliquer la différence en utilisant la
mvn dependency:tree
commandeConsidérez l'exemple ci-dessous
Parent POM - Mon projet
Child POM - module de données
Child POM - module d'application (n'a pas de dépendance supplémentaire, donc laisser les dépendances vides)
Lors de l'exécution de la
mvn dependency:tree
commande, nous obtenons le résultat suivantGoogle goyave est répertorié comme dépendance dans chaque module (y compris le parent), tandis que l' apache commons est répertorié comme dépendance uniquement dans le module de données (pas même dans le module parent)
la source
Si la dépendance a été définie dans l'élément dependencyManagement du pom de niveau supérieur, le projet enfant n'a pas dû répertorier explicitement la version de la dépendance. si le projet enfant définissait une version, il remplacerait la version répertoriée dans la section dependencyManagement du POM de niveau supérieur. Autrement dit, la version dependencyManagement n'est utilisée que lorsque l'enfant ne déclare pas directement une version.
la source
Dans le POM parent, la principale différence entre le
<dependencies>
et<dependencyManagement>
est la suivante:Les artefacts spécifiés dans la
<dependencies>
section seront TOUJOURS inclus en tant que dépendance du ou des modules enfants.Les artefacts spécifiés dans la section ne seront inclus dans le module enfant que s'ils ont également été spécifiés dans la section du module enfant lui-même. Pourquoi est-il bon de demander? car vous spécifiez la version et / ou la portée dans le parent et vous pouvez les laisser de côté lorsque vous spécifiez les dépendances dans le POM enfant. Cela peut vous aider à utiliser des versions unifiées pour les dépendances des modules enfants, sans spécifier la version dans chaque module enfant.
la source
Dans mes propres mots, votre
parent-project
aide vous fournit 2 types de dépendances:<dependencies>
section de votreparent-project
sont héritées par tous leschild-projects
child-projects
. Ainsi, vous utilisez la<dependencyManagement>
section, pour déclarer toutes les dépendances que vous allez utiliser dans vos différentschild-projects
. La chose la plus importante est que, dans cette section, vous définissez un<version>
afin que vous n'ayez pas à le déclarer à nouveau dans votrechild-project
.Le
<dependencyManagement>
point de vue (corrigez-moi si je me trompe) est juste utile en vous aidant à centraliser la version de vos dépendances. C'est comme une sorte de fonction d'aide.la source
Dans Eclipse, il existe une autre fonctionnalité dans le
dependencyManagement
. Quanddependencies
est utilisé sans lui, les dépendances non trouvées sont notées dans le fichier pom. SidependencyManagement
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 autres ...)la source
La différence entre les deux est mieux apportée dans ce qui semble une définition nécessaire et suffisante de l'élément dependencyManagement disponible dans les documents du site Web Maven:
dependencyManagement
"Informations de dépendance par défaut pour les projets qui héritent de celui-ci. Les dépendances de cette section ne sont pas immédiatement résolues. Au lieu de cela, lorsqu'un POM dérivé de celui-ci déclare une dépendance décrite par un groupId et un artifactId correspondants, la version et d'autres valeurs de cette section sont utilisés pour cette dépendance s'ils ne sont pas déjà spécifiés. " [ https://maven.apache.org/ref/3.6.1/maven-model/maven.html ]
Il doit être lu avec plus d'informations disponibles sur une autre page:
«..L'ensemble minimal d'informations pour faire correspondre une référence de dépendance à une section dependencyManagement est en fait {groupId, artifactId, type, classifier}. Dans de nombreux cas, ces dépendances feront référence à des artefacts jar sans classificateur. Cela nous permet de raccourcir l'identité définie sur {groupId, artifactId}, car la valeur par défaut pour le champ type est jar et le classificateur par défaut est null. " [ https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html ]
Ainsi, tous les sous-éléments (portée, exclusions, etc.) d'un élément de dépendance - autres que groupId, artifactId, type, classifier, et pas seulement la version - sont disponibles pour le verrouillage / par défaut au point (et donc hérités de à partir de là) vous spécifiez la dépendance dans un élément dependencyElement. Si vous aviez spécifié une dépendance avec les sous-éléments type et classifier (voir la première page Web citée pour vérifier tous les sous-éléments) comme non jar et non null respectivement, vous auriez besoin de {groupId, artifactId, classifier, type} pour référencer (résoudre) cette dépendance à tout moment dans un héritage provenant de l'élément dependencyManagement. Sinon, {groupId, artifactId} suffirait si vous n'avez pas l'intention de remplacer les valeurs par défaut pour le classificateur et le type (jar et null respectivement). Par défaut, c'est un bon mot-clé dans cette définition; tout sous-élément (autre que groupId,
Ainsi, tout élément de dépendance en dehors de dependencyManagement, que ce soit en tant que référence à un élément de dependencyManagement ou en tant que autonome est immédiatement résolu (c'est-à-dire installé dans le référentiel local et disponible pour les chemins de classe).
la source