SBT组装罐排除

时间:2013-11-21 21:05:31

标签: apache-spark jar sbt sbt-assembly

我使用spark(在java API中)并且需要一个可以推送到集群的jar,但是jar本身不应该包含spark。当然,部署作业的应用程序应该包含spark。

我想:

  1. sbt run - 应该编译和执行所有内容
  2. sbt smallAssembly - 创建一个没有火花的jar
  3. sbt assembly - 创建一个包含所有内容(包括spark)的超级jar,以便于部署。
  4. 我有1.和3.工作。关于我怎么可以2的任何想法?我需要将哪些代码添加到build.sbt文件中?

    这个问题不仅与火花有关,而且与我可能也希望排除的任何其他依赖性无关。

2 个答案:

答案 0 :(得分:29)

%“提供”配置

从胖jar中排除jar的第一个选项是对库依赖项使用"provided"配置。 "provided"来自Maven的provided范围,其定义如下:

  

这与compile非常相似,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为范围provided,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。

由于您将代码部署到容器(在本例中为Spark),与您的注释相反,您可能需要Scala标准库和其他库jar(例如,如果您使用它,则为Dispatch)。这不会影响runtest

packageBin

如果您只是想要源代码,而没有Scala标准库或其他库依赖项,那么packageBin将内置到sbt中。这个打包的jar可以与你可以使用sbt-assembly的assemblyPackageDependency制作的仅依赖jar一起组合。

在集会中排除了贾斯

最后一个选项是使用excludedJars in assembly

excludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "spark-core_2.9.3-0.8.0-incubating.jar"}
}

答案 1 :(得分:7)

对于像我这样的初学者,只需将% Provided添加到Spark依赖项中即可将它们从超级jar中排除:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" % Provided
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.4.0" % Provided
build.sbt中的