Как исправить конфликты версий зависимостей?

У меня есть 2 разных модуля, называемых A и B. У меня также есть еще один модуль, называемый C.

A использует C версии 1.0

B использует C версии 2.0

Проблема в том, что C 2.0 не имеет обратной совместимости, хотя значения groupId и ArtiftId одинаковы для C 1.0 и C 2.0. Я не могу исключить одно из них в своем pom.xml и использовать другое для A и B. Поэтому тег исключения в этом случае не работает. Мне нужно внедрить зависимость в конкретный модуль.

Я узнал, что могу использовать OSGI для этой цели, но не смог заставить его работать. Если у вас есть учебник по OSGI или другое решение, было бы здорово.


person Mehmet    schedule 30.03.2014    source источник
comment
В данном случае OSGi — это массивная кувалда, чтобы расколоть желудь. Просто исключите зависимость и включите нужную версию.   -  person Boris the Spider    schedule 30.03.2014
comment
@BoristheSpider Есть ли способ использовать две разные версии пакета в одном проекте? Пакет A - это просто пакет jar, я не могу (не должен) его изменять. С другой стороны, C 2.0 поддерживает новые функции, которые мне нужно использовать в пакете B.   -  person Mehmet    schedule 30.03.2014
comment
Вы знаете об использовании различных загрузчиков классов   -  person Thorbjørn Ravn Andersen    schedule 30.03.2014


Ответы (2)


Без использования OSGI существует альтернатива рефакторинга приложения, чтобы запускать A и B в отдельных файлах WAR, в случае, если это выполняется на сервере веб-приложений.

Таким образом, WAR 1 содержит A и C 1.0, а WAR 2 содержит B и C 2.0, и в этом случае помех нет.

person Angular University    schedule 30.03.2014
comment
Это классическое Java-приложение, а не веб-приложение. Параметр AFAIK WAR доступен только для сервлетов. - person Mehmet; 30.03.2014
comment
тогда альтернатива состоит в том, чтобы либо разделить его на два отдельных приложения, если это возможно, в противном случае было бы лучше запускать из контейнера OSGI, где приложения представляют собой два пакета, которые зависят от разных версий пакета C. Вам понадобится пакет C самостоятельно если наборов нет. Взгляните на облегченный OSGI-контейнер Apache Karaf karaf.apache.org - person Angular University; 30.03.2014

Попробуйте плагин Maven Shade с relocation в проекте A и/или B. Это позволит включить классы C в ваш проект. И поскольку C получает другой путь к пакету, конфликтов классов больше не будет.

person Robert Scholte    schedule 30.03.2014