如何有效地使用SBT,Spark和"提供"依赖项?

Ale*_*rin 25 intellij-idea sbt sbt-assembly apache-spark

我正在Scala中构建一个Apache Spark应用程序,我正在使用SBT来构建它.这是事情:

  1. 当我在IntelliJ IDEA下开发时,我希望Spark依赖项包含在类路径中(我正在使用主类启动常规应用程序)
  2. 当我打包应用程序(感谢sbt-assembly)插件时,我希望Spark依赖项包含在我的胖JAR中
  3. 当我运行单元测试时sbt test,我希望Spark依赖项包含在类路径中(与#1相同,但来自SBT)

为了匹配约束#2,我将Spark依赖关系声明为provided:

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
  ...
)
Run Code Online (Sandbox Code Playgroud)

然后,sbt-assembly的文档建议添加以下行以包含单元测试的依赖项(约束#3):

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
Run Code Online (Sandbox Code Playgroud)

这使得约束#1没有被完全填充,即我无法在IntelliJ IDEA中运行应用程序,因为没有拾取Spark依赖项.

使用Maven,我使用特定的配置文件来构建超级JAR.这样,我将Spark依赖关系声明为主要配置文件(IDE和单元测试)的常规依赖关系,同时将它们声明provided为胖JAR打包.请参阅https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml

使用SBT实现这一目标的最佳方法是什么?

Ale*_*rin 17

(用我从另一个频道得到的答案回答我自己的问题......)

为了能够从IntelliJ IDEA运行Spark应用程序,您只需在src/test/scala目录中创建一个主类(test,而不是main).IntelliJ将获取provided依赖项.

object Launch {
  def main(args: Array[String]) {
    Main.main(args)
  }
}
Run Code Online (Sandbox Code Playgroud)

感谢Matthieu Blanc指出这一点.


Mar*_*app 13

在IntelliJ配置中使用新的"包含依赖关系"提供"范围".

带有提供范围的IntelliJ配置复选框

  • 是的,此选项在社区版 2019.1 中可用,您需要转到“打开编辑运行/调试配置对话框”,然后“编辑配置” (2认同)

Rob*_*giu 0

您不应该在 SBT 中查找 IDEA 特定设置。首先,如果程序要使用spark-submit运行,那么你如何在IDEA上运行它?我猜你会在 IDEA 中作为独立运行,同时通过 Spark-Submit 正常运行它。如果是这种情况,请使用“文件”|“项目结构”|“库”在 IDEA 中手动添加 Spark 库。您将看到 SBT 列出的所有依赖项,但您可以使用 +(加号)符号添加任意 jar/maven 工件。这应该够了吧。