web-dev-qa-db-fra.com

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

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

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

dans le <dependencyManagement> section.

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

Quelle est la différence entre la solution ci-dessus et la simple dépendance à ce pom sans import (je vois que ce dernier est appelé "groupement de dépendances")? Est-ce que la seule différence entre ces dépendances "groupées" et leur priorité plus faible est la résolution de la priorité des dépendances?

98
grafthez

Vous pouvez uniquement importer des dépendances gérées . Cela signifie que vous pouvez uniquement importer d'autres POM dans la section dependencyManagement 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 section dependencyManagement du fichier other-pom-artifact-id sont inclus dans la section dependencyManagement de votre POM. Vous pouvez ensuite référencer ces dépendances dans la section dependency de votre POM (et tous ses POM enfants) sans avoir à inclure un version etc.

Cependant, si dans votre POM, vous définissez simplement une dépendance normale à other-pom-artifact-id puis tous dependencies de la section dependency de la other-pom-artifact-id sont inclus de manière transitoire dans votre projet - toutefois les dépendances définies dans la section dependencyManagement du other-pom-artifact-id ne sont pas inclus 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 maven, qui peut expliquer cela beaucoup mieux que moi, Gestion des dépendances dans Maven et contenant également des informations spécifiques sur importation de dépendances .

167
DB5

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

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

Vous pourriez avoir différents poms - chacun managing un groupe de dépendances connexes. Les projets qui les utilisent peuvent import ces poms, puis spécifier les dépendances dont ils ont besoin sans se soucier de la version. Ceci est essentiellement le concept bill of materials, Qui est illustré dans les liens spécifiés par @ DB5.

Cela permet d'éviter que parent poms De projets complexes comportant plusieurs modules ne soit trop volumineux et trop lourd.

13
Raghuram

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

  1. La section dependencyManagement ne déclare que les dépendances et leurs détails dans le projet actuel - le but est de gérer les détails et de les réutiliser dans d’autres projets, soit par héritage ( parent ) ou importer ( portée ). Cela revient à déclarer un type de données dans le programme et à le rendre disponible.

  2. La section ) définit l'utilisation réelle des dépendances dans le projet, héritant éventuellement des détails (par exemple, 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 . Ceci est analogue à l'instanciation d'une instance variable d'un type de données dans un programme où cela est nécessaire.

5
Van