Как работает транзитивная зависимость для зависимости второго уровня - PullRequest
1 голос
/ 21 июня 2019

У меня есть следующее дерево зависимостей.

[INFO] +- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO] |  +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO] |  +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO] |  |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO] |  |  +- commons-lang:commons-lang:jar:2.6:compile

Когда я добавляю зависимость "commons-lang" в качестве зависимости верхнего уровня в файле pom, она автоматически удаляет транзитивную зависимость для common-lang, даже не исключая ее изфайл pom.

[INFO] +- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO] |  +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO] |  +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO] |  |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO] |  |  +- javax.inject:javax.inject:jar:1:compile

Ожидается, что он должен исключать общий язык, когда мы исключаем его из jasperreports.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Медиация зависимости - это правило, о котором вы говорите. Это одно из правил, которым следует maven для управления переходными зависимостями.

Он поместит commons-lang в дерево зависимостей в соответствии с его ближайшим определением в pom.

Вы можете прочитать обо всех правилах здесь:
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

Итак, чтобы процитировать их:

Передача зависимостей - определяет, какая версия артефакта будет выбрана, когда несколько версий встречаются как зависимости. Maven выбирает «ближайшее определение». То есть он использует версию ближайшей зависимости от вашего проекта в дереве зависимостей. Вы всегда можете гарантировать версию, явно объявив ее в POM вашего проекта.

И зависимость commons-lang никогда не удаляется, ее место в переходном дереве изменилось. Теперь она стала зависимой от уровня 1.

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile
0 голосов
/ 21 июня 2019

Когда в ваших проектах объявляется зависимость, pom maven будет использовать это объявление вместо транзитивной зависимости.

Опущенные зависимости не отображаются в дереве зависимостей maven, и я только что узнал, что начиная с версии 3.0 подключаемого модуля maven-опций более подробный параметр больше не поддерживается - что будет показывать пропущенную зависимость.

Я вижу это, когда пытался указать опцию -Dverbose в командной строке maven (для "mvn dependency: tree -Dverbose = true"):

 Verbose not supported since maven-dependency-plugin 3.0

См. Комментарии к ответу в Показать пропущенные версии в зависимости maven: tree?

...