在 SBT 生成的胖 JAR 中包含 Spark 包 JAR 文件

Posted

技术标签:

【中文标题】在 SBT 生成的胖 JAR 中包含 Spark 包 JAR 文件【英文标题】:Including a Spark Package JAR file in a SBT generated fat JAR 【发布时间】:2017-10-17 14:17:39 【问题描述】:

spark-daria 项目是 uploaded to Spark Packages,我正在使用 sbt-spark-package plugin 访问另一个 SBT 项目中的 spark-daria 代码。

我可以在sbt assembly 生成的胖JAR 文件中包含spark-daria,在build.sbt 文件中使用以下代码。

spDependencies += "mrpowers/spark-daria:0.3.0"

val requiredJars = List("spark-daria-0.3.0.jar")
assemblyExcludedJars in assembly := 
  val cp = (fullClasspath in assembly).value
  cp filter  f =>
    !requiredJars.contains(f.data.getName)
  

这段代码感觉像是 hack。有没有更好的方法将 spark-daria 包含在 fat JAR 文件中?

注意我想在这里构建一个半胖的 JAR 文件。我希望将 spark-daria 包含在 JAR 文件中,但我不希望 JAR 文件中包含所有 Spark!

【问题讨论】:

【参考方案1】:

README for version 0.2.6 声明如下:

在任何情况下,如果您确实无法使用 sparkComponents 指定 Spark 依赖项(例如,您有排除规则)并将它们配置为 provided(例如,用于演示的独立 jar),您可以使用 spIgnoreProvided := true 正确使用assembly 插件。

然后,您应该在构建定义中使用此标志,并将 Spark 依赖项设置为 provided,就像我在以下示例中使用 spark-sql:2.2.0 一样:

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0" % "provided"

请注意,通过设置此选项,您的 IDE 可能不再具有在本地编译和运行代码所需的依赖项引用,这意味着您必须手动将必要的 JAR 添加到类路径中。我经常在 IntelliJ 上执行此操作,我所做的就是在我的机器上安装一个 Spark 分发版,并将其 jars 目录添加到 IntelliJ 项目定义中(this question 可能会帮助您,如果您需要它)。

【讨论】:

以上是关于在 SBT 生成的胖 JAR 中包含 Spark 包 JAR 文件的主要内容,如果未能解决你的问题,请参考以下文章

配置 sbt 项目以在“sbt run”中包含外部 Main 方法

中继:有条件地在突变的胖查询中包含字段

如何在“sbt dist”在目标/通用内部生成的脚本文件夹中包含一个附加文件?

sbt / maven是否包含jar文件中的完整依赖项?

非托管 jar 文件中的 SBT 插件

如何在 Maven 生成的 jar 中包含特定文件夹?