web-dev-qa-db-fra.com

Résolution des dépendances Maven et redéfinition de la portée

Avertissement

(J'ai à l'origine posé la question de manière très détaillée ici . Je l'ai extrait ici en tant que maven-users la liste de diffusion est restée silencieuse sur cette question.) (pas seulement une autre question pour les débutants)

Référence

Mon matériel de référence est http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management ; s'il vous plaît laissez-moi savoir dans cette discussion si c'est obsolète ou faux.

Question

Il y a une section dans ce document qui commence par "Une seconde, et très important ...". Dans ce qui suit, je ferai référence aux projets de cette section A et B, et j'en extrairai des extraits.

Dans cette section, vous verrez que le projet A a un <dependencyManagement> section qui - entre autres - définit un artefact, c, comme ayant une portée compile:

<!-- In A's pom.xml; condensed for brevity -->
<dependencyManagement>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <version>1.0</version>
        <scope>compile</scope> <!-- look: compile scope -->
    </dependency>
</dependencyManagement>

Ensuite, vous verrez un pom.xml pour le projet B qui (a) hérite du projet A (héritant ainsi de sa section dependencyManagement) et (b) établit une dépendance à l'égard de l'artefact c , sans avoir à spécifier son version. Vous remarquerez également que la dépendance à l'artefact c remplace la portée de c pour être runtime, pas compile:

<!-- In B's pom.xml, whose parent is A's pom.xml (above); condensed for brevity -->
<dependencies>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <scope>runtime</scope> <!-- look: runtime scope -->
    </dependency>
</dependencies>

Encore une fois, vous remarquerez qu'il n'y a pas de <version>, mais il y a un <scope>runtime</scope> élément.

Mon interprétation de ceci est que quand tout est dit et fait, B dépendra de la version 1.0 de l'artefact c dans runtime portée, pas compile portée.

Est-ce exact? Ma maven-ear-plugin bug repose sur le fait que c'est le comportement attendu. Ce n'est pas ce qui se passe lorsque le maven-ear-plugin construit un .ear fichier.

Ensuite, si c'est correct, je m'attendrais également à ce que si l'artefact c ait des dépendances transitives runtime elles soient disponibles dans le chemin de classe Bruntime (tel que défini) par le tableau quelque peu déroutant de http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope ).

Est-ce exact?

32
Laird Nelson

Fonctionnement mvn dependency:tree sur l'exemple de projet publié dans le lien de bogue spécifié ci-dessus,

[INFO] Building MEAR-143 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143 ---
[INFO] ljnelson:mear-143:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Leaf 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-leaf ---
[INFO] ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Middle 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-middle ---
[INFO] ljnelson:mear-143-middle:jar:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:runtime
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 EAR 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-ear ---
[INFO] ljnelson:mear-143-ear:ear:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-middle:jar:1.0-SNAPSHOT:runtime
[INFO] |  \- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:test (scope managed from ru
ntime)
[INFO] \- junit:junit:jar:4.8.2:test

La dépendance scope de mear-143-leaf dans mear-143-middle, où la dépendance est explicitement définie est en effet runtime, remplaçant la portée test définie dans la section dependencyManagement du parent pom, mear-143.

Dans mear-143-ear, mear-143-leaf est inclus transitoirement. Ici l'étendue test définie dans dependencyManagement de mear-143 a priorité sur la portée héritée runtime.

Cela, je suppose, est conforme à ce qui est spécifié dans le deuxième point de la section que vous avez mentionnée ci-dessus. Le citer ici et mettre en évidence en gras et en italique les parties pertinentes:

b est défini dans la section de gestion des dépendances du parent B et puisque la gestion des dépendances a priorité sur la médiation des dépendances pour les dépendances transitives , la version 1.0 sera sélectionnée si elle est référencée dans pom a ou c. b aura également la portée de compilation

24
Raghuram