JAR HELL в IDE (intelliJ), mvn-test и mvn-package: как унифицировать перемещение зависимостей во всех настройках?

Простой случай для меня: я использую 2 очень популярные, но конфликтующие библиотеки scala: Spark SQL и JSON4s. Каждый зависит от разных версий синтаксического анализатора XML Jackson.

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

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

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


person tribbloid    schedule 05.09.2015    source источник
comment
Какие существуют версии Джексона? Вы можете переопределить одну из зависимостей в своем собственном pom.xml, чтобы существовал только один экземпляр.   -  person Tassos Bassoukos    schedule 06.09.2015
comment
Вы не поверите: 3.2.10 (Spark) против 3.2.11 (мой код). Если Spark jackson переопределен на 3.2.11, у него будет ошибка classNotFound, если я изменю свой jackson на 3.2.10, некоторые из моих тестов и функций будут нарушены. Так что я сейчас в дилемме   -  person tribbloid    schedule 06.09.2015
comment
Я полушучу, но используйте OSGi для загрузки обеих версий...   -  person Tassos Bassoukos    schedule 06.09.2015
comment
В противном случае, вы не можете создать перемещенные версии нужных вам библиотек в своем собственном идентификаторе группы? Клонировать, перемещать/переименовывать, устанавливать mvn и повторно использовать напрямую?   -  person Tassos Bassoukos    schedule 06.09.2015
comment
Будет ли более старая версия JSON4, использующая тот же джексон, что и Spark?   -  person Thorbjørn Ravn Andersen    schedule 06.09.2015
comment
Очень много вопросов :) Я ничего не знаю об OSGI, так что, наверное, займусь этим позже. P4: Я не знаю, можно ли это сделать из коробки, имеете ли вы в виду конфигурацию плагина maven (все, что не связано с копированием файлов в папку .m2)? P5: Нет, мне нужно десериализовать универсальный класс, у которого нет параметра строкового типа, в Json4s 3.2.10 эта функция еще не добавлена ​​(и по неизвестной причине 3.2.11 не имеет обратной совместимости)   -  person tribbloid    schedule 06.09.2015
comment
Что именно делает простое решение, так это перенести пакет org.json4s.jackson и com.fasterxml.jackson в новое место. иметь в виду?   -  person Thorbjørn Ravn Andersen    schedule 06.09.2015
comment
P7: это функция плагина maven-shade при упаковке в толстую банку: в основном это означает перемещение всех файлов классов в json4s 3.2.11 в новый пакет с другим именем и изменение моего байт-кода java (или загрузчик классов , не могу вспомнить, какой именно), чтобы использовать их. Поскольку байт-код Spark не будет изменен, он по-прежнему может безопасно использовать 3.2.10 без нарушения работы. Весь этот процесс происходит автоматически.   -  person tribbloid    schedule 06.09.2015
comment
Если вы должны иметь два в одном и том же загрузчике классов (что вы, вероятно, и делаете), я бы создал новый артефакт maven в вашем текущем дереве исходного кода, где плагин maven shadow работает на json4s, как вы описываете, но это только запустите mvn clean install, а затем перепишите свой код, чтобы использовать измененные имена классов json4s.   -  person Thorbjørn Ravn Andersen    schedule 06.09.2015
comment
Это бесполезно, плагин maven-shade работает только с упаковкой толстой банки, он ничего не перезаписывает в обычных банках, которые выпускаются в локальный репозиторий maven (с использованием «mvn clean install»).   -  person tribbloid    schedule 06.09.2015
comment
Давайте продолжим это обсуждение в чате.   -  person tribbloid    schedule 06.09.2015
comment
Тогда используйте что-то еще, что может.   -  person Thorbjørn Ravn Andersen    schedule 07.09.2015
comment
Вот собственно и мой вопрос, что за штука может?   -  person tribbloid    schedule 07.09.2015


Ответы (1)


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

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

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

person Edwin Buck    schedule 11.09.2015
comment
Это звучит намного сложнее, чем я думал: раньше я считал, что затененные артефакты просто переименованы в пакеты и могут сосуществовать с незатененными (при условии, что один из них используется исключительно мной, а не другой библиотекой). Раньше я понижал версию для других случаев, но в этом случае json4s-jackson 3.11 предоставляет некоторые важные функции, которые практически невозможно реализовать в более старой версии. - person tribbloid; 14.09.2015
comment
@tribbloid Вам это не понравится, но затененный вариант предназначен в первую очередь для тех, кому трудно поддерживать путь к классам. Он буквально распаковывает jar-файлы (поскольку они представляют собой zip-файлы) и копирует их в целевой jar-файл (снова zip-файлы), поэтому затенение, когда вам нужно использовать разные версии одного и того же jar-файла, обычно оставляет вам одну рабочую версию этого jar-файла (последнюю one) и ссылки на элементы, которые знают о старой банке, иногда ломаются, в зависимости от того, функционируют ли зависимые классы идентично своим заменам. - person Edwin Buck; 14.09.2015
comment
Если возможно, и если вы не хотите брать на себя необходимость компилировать все это, я бы попытался найти дату, когда все библиотеки выровнены, а затем обновить / понизить компоненты, чтобы получить желаемый выпуск. Иногда это означает только исправление и компиляцию нескольких элементов вместо этого огромного кучи вещей. - person Edwin Buck; 14.09.2015