Подтвердить что ты не робот

Разрешение зависимостей Maven и область переопределения

отказ

(Первоначально я задал вопрос очень подробно здесь. Я привел его здесь, поскольку список рассылки maven-users затих на этом вопросе.) (Не просто еще один вопрос новичка)

Ссылка

Моим справочным материалом является http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management; пожалуйста, дайте мне знать в этой дискуссии, если это устарело или неправильно.

Вопрос

В этом документе есть раздел, который начинается со слов "Второй и очень важный...". В дальнейшем я сошлюсь на этот раздел проектов A и B и извлечу из них.

В этом разделе вы увидите, что у проекта A есть раздел <dependencyManagement> котором, среди прочего, определен артефакт c, имеющий compile области действия:

<!-- In A 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>

Затем вы увидите pom.xml для проекта B который (a) наследует от проекта A (таким образом, наследует его раздел dependencyManagement) и (b) устанавливает зависимость от артефакта c, без необходимости указывать его version. Вы также заметите, что зависимость от артефакта c переопределяет область действия c для runtime, а не для compile:

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

Опять же, вы заметите, что нет элемента <version>, но есть элемент <scope>runtime</scope>.

Моя интерпретация этого заключается в том, что когда все сказано и сделано, B будет зависеть от версии 1.0 артефакта c в области runtime, а не от области compile.

Это верно? Моя ошибка в maven-ear-plugin основана на том факте, что это ожидаемое поведение. Это не то, что происходит, когда maven-ear-plugin создает файл .ear.

Далее, если это правильно, я бы также ожидал, что если бы артефакт c имел какие-либо транзитивные зависимости runtime они были бы доступны в B classpath runtime (как определено несколько сбивающей с толку таблицей в http://maven.apache.org/guides/introduction/Введение-в-зависимость-механизм .html # Dependency_Scope).

Это верно?

4b9b3361

Ответ 1

Запуск mvn dependency:tree в примере проекта, размещенного в указанной выше ссылке на ошибку,

[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

Зависимость scope из mear-143-leaf в mear-143-middle, где зависимость явно определена, действительно во runtime, отменяя test объем, определенный в dependencyManagement секции родительского П, mear-143.

В mear-143-ear, mear-143-leaf включается транзитивно. Здесь test область, определенная в dependencyManagement mear-143 имеет приоритет над унаследованной областью runtime.

Это, я думаю, соответствует тому, что указано во втором пункте в разделе, который вы упомянули выше. Цитируя это здесь и выделив жирным шрифтом и курсивом соответствующие части:

b определено в разделе родительского управления зависимостями B, и поскольку управление зависимостями имеет приоритет над посредничеством зависимостей для транзитивных зависимостей, будет выбрана версия 1.0, если на нее будут ссылаться в или c pom. b также будет иметь область компиляции