Maven: версия Shade используется вместо сторонней зависимости - PullRequest
0 голосов
/ 08 октября 2018

Допустим, мой проект называется A, а Foo и Bar являются сторонними библиотеками.А зависит от версии Foo 1 и бара.Панель зависит от версии Foo 2:

A -> Foo version 1  
  \-> Bar  
      \-> Foo version 2

С помощью этой конфигурации плагина Maven для оттенков в моем проекте A, POM

<relocation>
  <pattern>Foo</pattern>
  <shadedPattern>FooA</shadedPattern>
</relocation>

используемая мной версия Foo версии 1 будет переименована/ переехал как FooA.

Вопрос: можно ли вместо этого переименовать / переместить Foo версии 2?Я знаю, что это можно сделать, если я могу изменить POM Bar, но не могу, поскольку я не являюсь дистрибьютором Bar.

1 Ответ

0 голосов
/ 09 октября 2018

Maven не позволяет иметь зависимость от нескольких версий одного и того же артефакта.Разрешение зависимости работает следующим образом:

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

«Ближайшее определение» означает, что используемая версия будет ближайшей к вашему проекту в дереве зависимостей.Например, если зависимости для A, B и C определены как A -> B -> C -> D 2.0 и A -> E -> D 1.0, то D 1.0 будет использоваться при построении A, поскольку путь от Aот D до E короче.Вы можете явно добавить зависимость к D 2.0 в A, чтобы принудительно использовать D 2.0.

Источник: Введение в механизм зависимости

Как предлагается в этот ответ решением может быть создание затененных JAR-файлов каждого модуля с такими конфликтами.В вашем примере это будет

  • создать модуль "Bar-shaded", который создаст затененный JAR-файл "Bar" и все его зависимости
  • в модуле "A" addзависимости от "Foo" версии 1 и "штриховой"
...