buildt.sbt: исключить зависимости из подмодуля depenOn - PullRequest
0 голосов
/ 07 сентября 2018

Есть похожий вопрос здесь , но это решение не работает в sbt v1.x

В сборке sbt хорошо документировано, как исключить зависимости при добавлении через libraryDependencies:

libraryDependencies += "log4j" % "log4j" % "1.2.15" exclude("javax.jms", "jms")

или предотвращение переходных зависимостей:

libraryDependencies += "org.apache.felix" % "org.apache.felix.framework" % "1.8.0" intransitive()

, но мой вопрос в том, как (и если) это можно сделать при объявлении dependsOn зависимостей подмодулей в многомодульномпроект, подобный этому:

lazy val core = project.dependsOn(util)

Как бы я сделал что-то подобное (неверный код в примере ниже), чтобы предотвратить ввод транзитивной зависимости через util:

lazy val core = project.dependsOn(util exclude("javax.jms", "jms"))

также, как и, что более важно, как исключить транзитивную зависимость от другого подмодуля в многомодульном проекте от доставки через util (где sub3 - другой проект подмодуля, объявленный в том же build.sbt):

lazy val core = project.dependsOn(util exclude sub3)

1 Ответ

0 голосов
/ 07 сентября 2018

Способ сделать это - использовать excludeDependencies SettingKey.

Краткий пример:

excludeDependencies ++= Seq(
  ExclusionRule("commons-logging", "commons-logging")
) 

Источник


Если вам случится определить ваши зависимости как val (как я), вам может быть полезно определить исключения на основе ваших зависимостей.Для этого вам понадобится простой метод:

def excl(m: ModuleID): InclExclRule = InclExclRule(m.organization, m.name)

, который позволяет легко исключать:

val theLib = "com.my.lib" % "artifact" % "version"

lazy val `projectA` = (project in file("projectA"))
  .settings(
    ...
    libraryDependencies ++= Seq(
      theLib
    )
  )

lazy val `projectB` = (project in file("projectB"))
  .settings(
    ...
    libraryDependencies ++= Seq(
      ...
    ),
    excludeDependencies ++= Seq(
      excl(theLib)
    )
  )
  .dependsOn(projectA)
...