SBT组装罐排除

use*_*110 12 jar sbt sbt-assembly apache-spark

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

我想要:

  1. sbt run - 应该编译和执行所有内容
  2. sbt smallAssembly - 创建一个没有火花的罐子
  3. sbt assembly - 创建一个包含所有内容(包括spark)的超级jar,以便于部署.

我有1.和3.工作.关于我怎么可以2的任何想法?我需要将哪些代码添加到build.sbt文件中?

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

Eug*_*ota 29

%"提供"配置

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

这非常类似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的依赖jar的jar组合assemblyPackageDependency.

排除装配中的贾斯

最后的选择是使用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"}
}
Run Code Online (Sandbox Code Playgroud)


Tol*_*sun 7

对于像我这样的初学者,只需添加% ProvidedSpark依赖项以从超级jar中排除它们:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" % Provided
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.4.0" % Provided
Run Code Online (Sandbox Code Playgroud)

build.sbt.