Maven переупаковывает транзитивные зависимости - PullRequest
0 голосов
/ 07 ноября 2018

Приложение состоит из модулей, и каждый модуль является конкретным проектом Maven с одним родителем. Эти модули используются в качестве банок в основном приложении. Каждый модуль использует сторонний SDK через Maven. Эти SDK имеют много зависимостей, и эти зависимости могут быть с одной и той же группой и артефактом, но с разными версиями. С ними трудно управлять, и у нас есть проблемы с NoSuchMethodError's. На мой взгляд, самый простой способ решить проблему - это получить источники проблемных зависимостей и источник SDK, изменить пакет (добавить префикс) и импортировать его и поместить в sdk jar. Но этот подход требует: еще одного git-репозитория для разветвленных jar-файлов SDK и частного maven-репозитория для их публикации и много времени. Есть ли плагин maven, который может помочь с этой проблемой, например плагин, который может собрать jar (наш модуль jar) со всеми зависимостями, включенными в него, но может изменить пакет всех зависимостей?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Поздравляем, вы столкнулись с проблемой пути к классам, которая называется "jar hell". Единственное безопасное решение, которое я знаю, - это использование разных загрузчиков классов для каждой версии одного и того же класса (если он не имеет обратной совместимости).

Класс идентифицируется по его полному имени (пакет и имя класса) и по загрузчику классов, который был загружен. Если приложение использует системный загрузчик классов по умолчанию, и в пути к классам имеется один и тот же класс в разных версиях, загрузчик классов будет загружать только одну версию. В оракуле JDK / JRE это тот, который появился первым в пути к классам. Если вам повезет, вы можете привести путь к классам (порядок и исключая зависимости) в особом порядке, в котором будет работать ваше приложение, но я бы не рекомендовал его, поскольку оно сильно зависит от реализации JDK / JRE.

OSGI - это технология, которая может быть полезна для этого, поскольку она предоставляет основанную на модуле инфраструктуру для использования различных загрузчиков классов.

0 голосов
/ 07 ноября 2018

Вы можете попробовать использовать плагин Maven Shade, который позволяет перемещать классы

https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

но я никогда не пробовал это сам.

В большинстве случаев лучше попытаться выровнять зависимости, чтобы в большинстве мест использовать одни и те же версии, а также уменьшить до минимума зависимости.

...