我使用spark(在java API中)并且需要一个可以推送到集群的jar,但是jar本身不应该包含spark。当然,部署作业的应用程序应该包含spark。
我想:
我有1.和3.工作。关于我怎么可以2的任何想法?我需要将哪些代码添加到build.sbt文件中?
这个问题不仅与火花有关,而且与我可能也希望排除的任何其他依赖性无关。
答案 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)。这不会影响run
或test
。
如果您只是想要源代码,而没有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
中的。