use*_*110 12 jar sbt sbt-assembly apache-spark
我使用spark(在java API中)并且需要一个可以推送到集群的jar,但是jar本身不应该包含spark.部署作业的应用程序当然应该包括spark.
我想要:
我有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).这不会影响run或test.
如果您只想要源代码,而不需要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)
对于像我这样的初学者,只需添加% 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.