Как изолировать библиотеки в неуправляемой зависимости.файл jar, чтобы они не конфликтовали с другими


Мне нужно добавить a .jar как неуправляемая зависимость от проекта sbt Scala (это java-stellar-sdk ). Все работает хорошо, пока я не бегу sbt test. Там, кажется, есть версия Mockito в .файл jar, который конфликтует с тем, который я использую в проекте. Я получаю много ошибок, что некоторые Mockito matchers не найдены, но все работает нормально без этого .банка в папке lib.

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

Альтернативный обходной путь также очень помог бы. Можно ли изолировать библиотеки в банке таким образом, чтобы я мог просто сделать определенный пакет видимым снаружи?

Обновление: The .jar содержит Mockito 2, но мой проект использует Mockito 1, поэтому это очень простой и очевидный конфликт, который я могу решить, обновив до Mockito 2 (что я попробовал, и это работает). Тем не менее, остается вопрос: есть ли другой разумный способ изолировать зависимость Mockito в.jar, чтобы не вмешиваться в мой проект в случае, если я не могу или не хочу разрешить конфликт, купите переход на более новую версию рассматриваемой библиотеки. Может быть, изменив его .банку переименовать конфликтующие пакеты? Я не знаю. Что-то вроде того.

Я знаю, что это очень общий вопрос, который, вероятно, обсуждался где-то еще в глубине. Однако я не нашел ничего, что действительно удовлетворило бы меня. Ссылки на соответствующие обсуждения этой темы, конечно, также приветствуются.
2 4

2 ответа:

Я могу придумать 3 способа для вас сделать это (упорядочено от простого к сложному):

  1. Удалите mockito 2 вручную из файла jar.
    Поскольку jar - это всего лишь zip-файл, вы можете извлечь его, удалить все конфликтующие файлы и снова упаковать.

  2. Скомпилируйте этот jar из исходного кода самостоятельно и установите mockito в качестве тестовой зависимости (как и должно быть). Если вы сделаете это, рассмотрите возможность открытия PR с вашим изменением, чтобы решить проблему для сообщества

  3. Тень файлы mockito в банке.
    затенение-это процесс переименования всех файлов в файле jar по определенным правилам. вы можете использовать либо jarjarlinks , либо с помощью плагина sbt assembly. смотрите этот ответ, чтобы начать работу с SBT assembly: https://stackoverflow.com/a/47974750/245024

Вы должны быть в состоянии организовать, чтобы ваши классы Mockito 1 появлялись перед классами Mockito 2 на пути к классу. Это приведет к тому, что ваши классы выиграют любые конфликты.