Затенение зависимости в Maven

У меня есть две зависимости, импортированные через Maven, которые импортируют общую библиотеку, но в разных версиях, но версии не совместимы друг с другом. По сути проблемы, описанные в этом посте:

дерево зависимостей

Но, к сожалению для меня, решение не так просто, как описано в блоге, потому что нет единой версии пакета Z это работает для обеих зависимостей.

Пропустив неудачные дизайнерские решения, которые привели к этому, поскольку я не контролирую ни одну из этих библиотек, я собираюсь переупаковать одну из зависимостей верхнего уровня и затенить все ее зависимости, чтобы она могла по существу использовать свою собственную изолированную версию. из Z, Возможно ли это сделать с Maven?

Одним из решений, которое я рассмотрел, является изоляция всех классов, которые зависят от пакета Y и положить их в отдельном приложении и доставки, как в тени jar который X импорт, однако мне интересно, есть ли более простой способ сделать это.

1 ответ

Решение

Как и все предлагали, вы можете использовать maven-shade-plugin. Проекты с открытым исходным кодом обрабатывают это путем создания одного подпроекта maven для каждой зависимости, которую необходимо заштриховать. Так что в вашем случае вам понадобится 3 проекта Maven:

  1. Один для зависимости затенения Y
  2. Один для зависимости затенения G
  3. Один для вашего оригинального проекта. Ваш оригинальный проект включает артефакты, созданные в 1. и 2. как зависимости.

Ваша иерархия проекта maven будет выглядеть так:

  • проект
    • pom.xml
    • тени-Y,
      • pom.xml
    • тень-G
      • pom.xml
    • приложение
      • pom.xml

Пример проекта с подпроектом maven для затенения зависимости приведен здесь. Посмотрите на папку shaded-ning19, чтобы узнать, как создать выделенный проект maven для затенения зависимости.

Другие вопросы по тегам