存在类似的问题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)
答案 0 :(得分:1)
方法是使用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)