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

时间:2017-05-17 23:39:26

标签: scala apache-spark sbt sbt-assembly spark-packages

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)
  }
}

此代码感觉像是黑客。有没有更好的方法在fat JAR文件中包含spark-daria?

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

1 个答案:

答案 0 :(得分:0)

README for version 0.2.6声明如下:

  

在任何情况下,你真的无法使用def flowControl(): answer = input("do you want run the 'displayLession' function? ( yes or no)").strip() if answer == ('y' or 'yes'): displayLesson() else: userTime() print('End program') 指定Spark依赖项(例如,你有排除规则)并将它们配置为sparkComponents(例如演示的独立jar),你可以使用provided正确使用spIgnoreProvided := true插件。

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

spark-sql:2.2.0

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