Maven: версия Shade используется вместо сторонней зависимости

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

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

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

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

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

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

1 ответ

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" добавить зависимости к "Foo" версии 1 и "Bar-shaded"
Другие вопросы по тегам