как maven определяет версию транзитивных зависимостей? - PullRequest
3 голосов
/ 12 марта 2020

Я строю проект java с использованием maven, и я заметил, что в одном из подпроектов включен jsonwebtoken 0.7.0.

https://github.com/WebGoat/WebGoat/blob/develop/webgoat-lessons/challenge/pom.xml

webgoat-pom

Затем из репозитория Maven (https://repo1.maven.org/maven2/io/jsonwebtoken/jjwt/0.7.0/jjwt-0.7.0.pom) jsonwebtoken 0.7.0 имеет зависимость jackson-databind v2.8.2;

enter image description here

Однако, когда я отслеживаю из журнала отладки maven, jackson-databind v2.10 фактически извлекается maven.

I Следует понимать, что если версия компонента не определена явно в POM, maven будет использовать по умолчанию самую последнюю версию, однако, в приведенном выше случае, почему бы maven все же решил переопределить версию до последней?

спасибо!

Ответы [ 2 ]

4 голосов
/ 15 марта 2020

Если зависимость добавляется в нескольких местах, Maven выбирает ту, которая:

  • ближе к вашей помете. xml в иерархии (транзитивная зависимость или транзитивная зависимость транзитивной зависимости) )
  • Если глубина одинакова - это первое вхождение.

Чтобы гарантировать, какая версия взята, вам нужно объявить ее в разделе <dependencyManagement>. Это переопределяет все, что объявлено в транзитивных зависимостях.

, если версия компонента не определена явно в POM, maven по умолчанию будет иметь самую последнюю версию

Нет Вы не можете определить зависимость без явной версии. Хотя Maven поддерживает диапазоны, но они считаются плохой практикой, поскольку это может привести к неповторяемым сборкам.

1 голос
/ 15 марта 2020

Я предполагаю, что у вас есть где-то зависимость, которая требует jackson-databind 2.10. Более высокая версия заставляет maven переопределять jackson-databind 2.8.2, требуемый jsonwebtoken.

Но если вы явно включите jackson-databind в ваш проект в другой версии, чем эта версия переопределяет версию из переходного Зависимость.

Если вы используете затмение, вы можете проверить «Иерархия зависимостей». Вот в качестве примера, если вы включите jackson-databind явно:

enter image description here

.. и здесь, если у вас есть две зависимости, обе включают транзитивную зависимость с разными версиями (в этом случае spring-aop: spring-boot-starter-security хочет 5.0.4.RELEASE, но обновляется из-за spring-boot-starter-weg до 5.1.5.RELEASE):

enter image description here

...