2015-09-05 4 views
5

Простой случай для меня: Я использую 2 очень популярных, но конфликтующих библиотеки scala: Spark SQL & JSON4s. Каждый из них зависит от разных версий парсера Jackson XML.JAR HELL в IDE (intelliJ), mvn-test и mvn-package: как унифицировать перемещение зависимостей во всех настройках?

Поскольку никто, кроме моей собственной программы, не использует JSON4s, простым решением является перенос пакетов org.json4s.jackson и com.fasterxml.jackson в новые местоположения.

Однако плагин maven-shade может делать это только в процессе упаковки, поскольку перед этим выполняются все тесты и IDE. Это все равно приводит к сбою всех тестов, независимо от того, должен ли выполняться тест mvn-test или scala в среде IDE.

Есть ли плагин, который может совместно управлять политиками переноса пакетов для всех трех случаев: JAR-упаковка/mvn-test/IDE-run? Я весь день искал Интернет и не нашел ответа.

+0

Каковы различные версии Джексона? Вы можете переопределить одну из зависимостей в вашем собственном pom.xml, чтобы существовал только один экземпляр. –

+0

Вы не поверите: 3.2.10 (Spark) vs 3.2.11 (Мой код). Если Spark jackson переопределен до 3.2.11, он имеет ошибку classNotFound, если я изменю свой jackson на 3.2.10 некоторые из моих тестов и перерывов в функциях. Итак, я сейчас в ситуации дилеммы – tribbloid

+0

Я только полушутя, но использую OSGi для загрузки обеих версий ... –

ответ

4

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

И для этих комментариев от OSGi лагеря, да, это то, что OSGi должно было исправить, но он не работает так хорошо в контексте Спарк :)

Рассматривали ли вы понижаем одну из двух версии для выравнивания ресурсов? Зачастую одна из библиотек удается выпустить в первую очередь, оставив вторую по чуть-чуть ... Иногда ответ можно найти при запуске последовательной, но более старой версии, которая согласуется с проектом «последний, чтобы быть выпущенным».

+0

Это звучит намного сложнее, чем я думал: я привык полагать, что затененные артефакты только что получили переименованные пакеты и могут сосуществовать с незаштрихованным (пока один из них используется мной исключительно, а не другой библиотекой). Ранее я отказался от других дел, но в этом случае json4s-jackson 3.11 предоставляет некоторые важные функции, которые практически невозможно реализовать в более старой версии. – tribbloid

+0

@tribbloid. Вам это не понравится, но затененный вариант в первую очередь предназначен для тех, кто трудно поддерживать путь класса. Он буквально распаковывает банки (поскольку они являются zip-файлами) и копирует их в целевую банку (снова zip-файлы), поэтому затенение, когда вы имеете разные версии одной и той же банки, обычно оставляет вам одну рабочую версию этой банки (последняя один), и ссылки на предметы, которые знают о старой банке, иногда ломаются, в зависимости от того, будут ли зависимые классы функционировать одинаково с их заменами. –

+1

Если возможно, и если вы не хотите использовать его для компиляции, я бы попытался найти дату, когда все библиотеки выравнивают, а затем обновляют/понижают компоненты, чтобы получить желаемую версию. Иногда это означает только исправление и компиляцию нескольких элементов вместо этого огромного шара. –