Как работает транзитивная зависимость для зависимости второго уровня

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

[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.


person abo    schedule 21.06.2019    source источник
comment
Это странно и не должно происходить.   -  person J Fabian Meier    schedule 21.06.2019


Ответы (2)


Посредничество зависимостей — это правило, о котором вы говорите. Это одно из правил, которым следует 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
person ramos    schedule 22.06.2019
comment
Нужно ли нам по-прежнему исключать commons-lang из jasperreports? - person abo; 24.06.2019

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

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

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

 Verbose not supported since maven-dependency-plugin 3.0

См. комментарии к ответу в Отображать пропущенные версии в maven dependency:tree?

person camtastic    schedule 21.06.2019