buildt.sbt:从dependsOn子模块中排除依赖项

时间:2018-09-07 14:29:16

标签: scala build dependencies sbt

存在类似的问题here,但该解决方案在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 :(得分:1)

方法是使用excludeDependencies SettingKey。

一个简短的例子:

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

Source


如果您碰巧将依赖项定义为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)