Почему 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")))
Другие вопросы по тегам