(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)
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.
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 B
runtime
(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?
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