如何使用sbt-assembly插件强制将提供的依赖项添加到Fat jar?

时间:2019-03-18 12:39:09

标签: scala sbt sbt-assembly

我有一个Spark项目,通常将其与sbt-assembly打包在一起。所有spark依赖项都标记为provided,并且不包含在我的胖子中。 我想要另一个命令来构建一个包含所有依赖关系的胖子罐,包括spark。 我没有运气就尝试以下方法:

lazy val standalone = project
.dependsOn(mainProj % "compile->compile;test->test;provided->compile")
.settings(
  logLevel in assembly := Level.Debug,
  assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = true, includeDependency = true)
)

注意,对How to add "provided" dependencies back to run/test tasks' classpath?的回答说明了如何向运行时类路径添加provided依赖项,但是我的问题是如何在执行sbt assembly之后使它们最终出现在打包的工件中

1 个答案:

答案 0 :(得分:1)

要构建一个真正的胖罐子来打包包括provided依赖项在内的所有内容,我们可以像这样重新定义fullClasspath in assembly

assembly / fullClasspath := (Compile / fullClasspath).value

如果我们将其放在这样的单独命令中

commands += Command.command("assemblyTrulyFatJar") { state =>
  """set assembly / fullClasspath := (Compile / fullClasspath).value""" :: "assembly" :: state
}

然后执行sbt assemblyTrulyFatJar应该打包所有内容,而sbt assembly保留其默认行为。