Почему SBT НЕ исключает эти библиотеки, несмотря на использование исключений?
Несмотря на следующее, sbt все еще захватывает lift-json. Зачем?
"net.liftweb" %% "lift-mapper" % "2.6-M4" % "compile" excludeAll(ExclusionRule("net.liftweb", "lift-json"))
Больше информации. Вот что показывает дерево зависимостей:
+-net.liftweb:lift-mapper_2.10:2.6-M4
[info] | +-net.liftweb:lift-db_2.10:2.6-M4
[info] | | +-net.liftweb:lift-util_2.10:2.6-M4
[info] | | | |
…
[info] | | | |
[info] | | | +-net.liftweb:lift-json_2.10:2.6-M4
Таким образом, зависимость есть лифт-маппер -> лифт-дБ -> лифт-утилитар -> лифт-json, возможно, исключение не является глубоким?
2 ответа
Ключевым моментом, который здесь неочевиден, является то, что исключения в sbt на самом деле являются просто правилами прохождения для основного движка Ivy. Поскольку Айви ничего не знает о соглашениях SBT (например, добавление _2.10
к зависимостям, зависящим от релиза Scala), вам нужно указать, что на самом деле должно быть исключено. В этом случае это означает, что строка должна выглядеть так:
"net.liftweb" %% "lift-mapper" % "2.6-M4" % "compile" excludeAll(ExclusionRule("net.liftweb", "lift-json_2.10"))
Возможно, есть некоторые улучшения, которые можно внести в sbt, чтобы он мог видеть, что, поскольку определенная вами зависимость зависит от версии Scala, он также должен попытаться добавить правило исключения для этого выпуска.
Возможно, от этого зависят и другие библиотеки. Вы можете найти эти библиотеки с помощью плагина sbt-dependency-graph. Или просто исключите его из всех зависимостей:
libraryDependencies ++= Seq(
......
).map(_.excludeAll(ExclusionRule("net.liftweb", "lift-json")))