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

IUn*_*own 9 dependencies scala build sbt

这里有一个类似的问题但该解决方案在 sbt v1.x 中不起作用

在 build sbt 中,详细记录了如何在添加时排除依赖项libraryDependencies

libraryDependencies += "log4j" % "log4j" % "1.2.15" exclude("javax.jms", "jms")
Run Code Online (Sandbox Code Playgroud)

或防止传递依赖:

libraryDependencies += "org.apache.felix" % "org.apache.felix.framework" % "1.8.0" intransitive()
Run Code Online (Sandbox Code Playgroud)

但我的问题是dependsOn在像这样的多模块项目中声明子模块的依赖项时如何(以及是否)可以做到这一点:

lazy val core = project.dependsOn(util)
Run Code Online (Sandbox Code Playgroud)

我将如何做这样的事情(下面示例中的无效代码)以防止通过util以下方式引入传递依赖:

lazy val core = project.dependsOn(util exclude("javax.jms", "jms"))
Run Code Online (Sandbox Code Playgroud)

以及如何,更重要的是,如何排除对多模块项目中另一个子模块的传递依赖util(在sub3同一个 build.sbt 中声明的另一个子模块项目在哪里):

lazy val core = project.dependsOn(util exclude sub3)
Run Code Online (Sandbox Code Playgroud)

Ata*_*ais 7

方法是使用excludeDependenciesSettingKey。

一个简短的例子:

excludeDependencies ++= Seq(
  ExclusionRule("commons-logging", "commons-logging")
) 
Run Code Online (Sandbox Code Playgroud)

来源


如果您碰巧将依赖项定义为val(像我一样),您可能会发现根据依赖项定义排除很有用。为此,您需要这个简单的方法:

def excl(m: ModuleID): InclExclRule = InclExclRule(m.organization, m.name)
Run Code Online (Sandbox Code Playgroud)

并且它允许轻松排除:

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)
Run Code Online (Sandbox Code Playgroud)