什么时候使用“ sbt汇编”和“ sbt编译&& sbt软件包”?

时间:2018-12-12 14:13:30

标签: scala apache-spark sbt

我想知道何时应该使用sbt assembly,何时应该使用sbt compile && sbt package

我正在使用Intellij IDEA在本地计算机上编写程序,并使用sbt compile && sbt package对其进行编译,然后将其上传到群集并使用spark-submit运行。这是最好的方法吗?我什么时候应该使用sbt assembly

2 个答案:

答案 0 :(得分:3)

  

我想知道何时应该使用sbt assembly,何时应该使用sbt compile && sbt package

引用sbt-assembly的网站(给出sbt assembly的网站):

  

目标很简单:使用所有依赖项为项目创建一个胖JAR。

build.sbt中的任何依赖项(未标记为Provided)将成为最终jar文件(称为uber-jar)的一部分。

至少要使用插件有两个原因:

  1. 将所有依赖项捆绑在一起放在一个jar文件中,这样更易​​于部署到生产环境(类似于Docker映像)
  2. 使用一个具有Spark版本1.6.0中的spark-submit的集群,使用一个Spark版本(例如2.0.0)运行您的应用程序

您使用sbt compile && sbt package来编译和打包应用程序的类(顺便说一句,它不必使用Spark)。该jar文件不包含应用程序的依赖项,因此必须以其他方式提供任何依赖项(并使部署有些麻烦)。

注意:sbt compile && sbt package只是sbt compile package的一个较长的变体,假设compile任务是package的依赖项,则只是sbt package

答案 1 :(得分:1)

“ sbt程序集”非常适合要包含所有依赖项的uber jar。您将需要程序集插件才能使用“ sbt程序集”。

通常,当您不想在目标计算机上单独提供依赖的jar时,这种jar可以很好地构建。通过这种包装,您可以避免与依赖的第三方jar版本不匹配相关的问题。