Исключая из 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
,