Quelle est la différence entre une dépendance de type «pom» avec une portée «import» et sans «import»?

112

À partir de Maven 2.0.9, il est possible d'inclure

<type>pom</type>
<scope>import</scope>

dans la <dependencyManagement>section.

Si je comprends bien, il sera "remplacé" par les dépendances incluses dans ce pom comme si elles étaient définies à l'origine ici.

Quelle est la différence entre la solution ci-dessus et la simple dépendance à ce pom sans importportée (j'ai vu ce dernier être appelé "regroupement de dépendances")? La seule différence est que de telles dépendances "groupées" ont une priorité inférieure lors de la résolution de la priorité des dépendances?

grafthez
la source

Réponses:

187

Vous ne pouvez importer que les dépendances gérées . Cela signifie que vous ne pouvez importer que d' autres POM dans la dependencyManagementsection du POM de votre projet. c'est à dire

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

Ce qui se passe alors, c'est que toutes les dépendances définies dans la dependencyManagementsection du other-pom-artifact-idsont incluses dans la dependencyManagementsection de votre POM . Vous pouvez ensuite référencer ces dépendances dans la dependencysection de votre POM (et tous ses POM enfants) sans avoir à inclure un versionetc.

Cependant, si dans votre POM vous définissez simplement une dépendance normale, other-pom-artifact-idalors tous dependenciesde la dependencysection de other-pom-artifact-idsont inclus de manière transitoire dans votre projet - cependant les dépendances définies dans la dependencyManagementsection de other-pom-artifact-idne sont pas incluses du tout.

Donc, fondamentalement, les deux mécanismes différents sont utilisés pour importer / inclure les deux types différents de dépendances (dépendances gérées et dépendances normales).

Il y a une bonne page sur le site Web de maven, qui peut expliquer cela bien mieux que moi, la gestion des dépendances dans Maven et elle contient également des informations spécifiques sur l' importation de dépendances .

DB5
la source
1
Si pomA in est le parent de pomB, pouvez-vous placer B dans la gestion des dépendances du projet A avec portée import?
Janez Kuhar
excellente réponse pour expliquer comment cela fonctionne, mais pourquoi ?? pourquoi vous ne voulez pas inclure les autres dépendances de manière transitoire? pouvez-vous aussi faire les deux? importer other-pom-artifact-id et déclarer ensuite other-pom-artifact-id comme dépendance également?
Junchen Liu
Un article sur DZone dit quelque chose de différent: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY et Skinny War
coz
1
@JunchenLiu: Supposons donc que vous n'utilisiez que quelques fonctionnalités du projet A, vous pouvez donc choisir d'inclure uniquement les dépendances transitoires requises pour cette fonctionnalité. Vous pouvez également résoudre ce problème en utilisant <exclude> dans <dependency>. Par exemple, vérifiez
Nitiraj
15

Vous ne pouvez pas avoir un pomprojet de type en tant que simple dependencydans un autre projet. (Eh bien, vous pouvez - mais cela ne fera rien d'utile). Il ne peut y avoir qu'une parent-childrelation. C'est essentiellement managing dependency through inheritance.

importla portée de la pomdépendance de type dans la <dependencyManagement>section vous permet d'obtenir l'équivalent de multiple inheritance.

Vous pourriez avoir différents poms- chacun managingun tas de dépendances liées. Les projets qui utilisent ceux - ci pourraient importceux - ci pomset préciser les dépendances dont ils ont besoin sans avoir à vous soucier de la version. C'est essentiellement lebill of materials concept, qui est illustré dans les liens spécifiés par @ DB5.

Cela permet d'éviter que parent pomsles projets complexes à plusieurs modules ne deviennent trop volumineux et trop lourds.

Raghuram
la source
8
Êtes-vous sûr? J'ai mis pom régulier (ayant ses propres dépendances) en tant que dépendance régulière dans un autre projet (guerre d'empaquetage) et j'ai obtenu toutes les dépendances du projet pom incluses dans WEB-INF / lib du projet cible. C'est pourquoi je pose cette question :)
grafthez
2
Merci @Raghuram, j'ai totalement oublié de mentionner l'option POM parent en répondant à la question. Quant à avoir un projet de type pom comme simple dépendance, cela est possible. Comme mentionné dans la question originale, il peut être utilisé pour regrouper les dépendances
DB5
5

Deux concepts, très similaires au paradigme de programmation orientée objet, aideront à répondre à la question:

  1. La section dependencyManagement déclare uniquement les dépendances et leurs détails dans le projet en cours - le but est la gestion des détails et la réutilisation dans d'autres projets, soit via l'héritage ( parent ) ou l'importation ( portée ). C'est comme déclarer un type de données dans un programme et le rendre disponible pour utilisation.

  2. La section dependency définit l'utilisation réelle des dépendances dans le projet, hérite éventuellement des détails (ie, version, etc.) des dépendances déclarées sous le dependencyManagment . C'est pourquoi vous aurez des dépendances manquantes si vous ne les mettez que dans dependencyManagment . Cela revient à instancier une instance de variable d'un type de données dans un programme là où cela est nécessaire.

Van
la source
C'est bien clair mais cela répond à une question différente de celle ci-dessus. :-)
Rick-777