如何在sbt中覆盖对某些任务的依赖

时间:2016-05-30 10:44:52

标签: scala apache-spark sbt

我想在某些Task中覆盖对项目的依赖。 我有一个使用spark的sbt多项目。

lazy val core = // Some Project

val sparkLibs = Seq(
  "org.apache.spark" %% "spark-core" % "1.6.1"
)

val sparkLibsProvided = Seq(
  "org.apache.spark" %% "spark-core" % "1.6.1" % "provided"
)

lazy val main = Project(
  id = "main",
  base = file("main-project"),
  settings = sharedSettings
).settings(
  name := "main",
  libraryDependencies ++= sparkLibs,
  dependencyOverrides ++= Set(
    "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4"
  )
).dependsOn(core)

当我尝试在我的纱线群集上提交胖罐时,我使用https://github.com/sbt/sbt-assembly任务。但在这种情况下,我想使用sparkLibsProvided代替sparkLibs之类的内容:

lazy val sparkProvided = (project in assembly).settings(
  dependencyOverrides ++= sparkLibsProvided.toSet
)

如何正确覆盖此依赖关系?

2 个答案:

答案 0 :(得分:3)

您可以创建一个新项目,这是一个专门的项目,用于使用提供的标志创建spark uber jar:

lazy val sparkUberJar = (project in file("spark-project"))
  .settings(sharedSettings: _*)
  .settings(
    libraryDependencies ++= sparkLibsProvided,
    dependencyOverrides ++= Set(
      "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4"
    )
  )

当你在sbt中聚集时,首先去上述项目:

sbt project sparkUberJar
sbt assembly

答案 1 :(得分:0)

这可以通过使用专门为您提供的key轻松实现:

assemblyExcludedJars in assembly := { 
  val cp = (fullClasspath in assembly).value
  cp filter {
    _.data.getName == "spark-core-1.6.1.jar"
  }
}

然而,这种方法被认为是hacky,如果你设法将配置拆分为子项目会更好,正如官方文档here中所警告的那样:

  

如果你需要告诉sbt-assembly忽略JAR,你可能做错了。程序集任务从您项目的类路径中获取deps JAR。尝试先修复类路径。