Исключая из Uber (толстый) банку в сб для Play! в Скале

У меня есть проект, для которого я должен включить толстую флягу для некоторого проприетарного оборудования - не спрашивайте, я знаю, лучше всего, чтобы фляга была на Центральном или другом репо, но это не так.:(Я должен поместить его в каталог lib, чтобы sbt рассматривал его как неуправляемую зависимость.

но кувшин включает в себя slf4j, его старую версию и когда Play! запускает, он выдает ошибку, сообщающую, что отсутствует статическая функция (которая была добавлена ​​в более новые версии slf4j.

Вот что я попробовал.

  • Я попытался добавить libraryDependency с помощью force(). Нет кости.
  • Я попробовал пару исключить все образцы, которые я нашел здесь. Нет кости.
  • В отчаянии я расстегнул молнию на банке, удалил slf4j и снова создал банку. Это работает!, но серьезно, это не мой первый выбор для поддержания проекта.

Кто-нибудь знает способ исключения чего-либо внутри Uber jar, которое является неуправляемой зависимостью в основанном на sbt проекте scala или play?

1 ответ

Вы можете затенить свою управляемую библиотеку slf4j и сделать так, чтобы не было конфликта зависимостей. Для этого вы можете использовать функцию затенения sbt-assembly.

Например, если вы используете slf4j-apiэто будет выглядеть так:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("org.slf4j.slf4j-api.**" -> "my_slf4j.@1")
    .inLibrary("org.slf4j" % "slf4j-api" % "1.7.21")
    .inProject
)

Это приведет к тому, что все, кто использует эту конкретную версию slf4j, изменит свое имя пакета с помощью my_slf4j префикс вместо org.slf4j,

Другие вопросы по тегам