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"