You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT中Provided依赖未被assembly排除的问题求助

SBT Provided Scope在Assembly中不生效的问题解决

你对Provided scope的理解完全正确:标记为Provided的依赖会在编译阶段被引用,但打包时不会被包含进jar,因为它们由运行环境(比如Spark集群)提供。但你遇到的jar大小不变的问题,是因为sbt-assembly插件默认不遵守Provided scope的规则——它的核心目标是生成包含所有依赖的fat jar,所以不管依赖的scope是什么,默认都会打包进去。

要解决这个问题,你需要给assembly插件添加额外配置,让它排除Provided scope的依赖。具体修改你的项目配置如下:

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.12.15"

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", _*) => MergeStrategy.discard
  case _ => MergeStrategy.first
}

lazy val root = (project in file("."))
  .settings(
    name := "sifi_pipeline",
    // 添加这行配置,排除所有Provided scope的依赖
    assemblyDependencyFilter := {
      val defaultFilter = assemblyDependencyFilter.value
      defaultFilter && DependencyFilter.excludeScope("provided")
    }
  )
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "3.3.2" % Provided,
  "org.apache.spark" %% "spark-sql" % "3.3.2" % Provided,
  "org.apache.spark" %% "spark-streaming" % "3.3.2" % Provided,
  "org.apache.spark" %% "spark-sql-kafka-0-10" % "3.3.2",
  "com.google.cloud.bigdataoss" % "gcs-connector" % "1.4.3-hadoop2"
)

补充说明

  • 上述配置通过assemblyDependencyFilter全局排除所有Provided scope的依赖,比逐个指定jar更灵活。
  • 如果你的sbt-assembly版本较旧,可能需要先在project/plugins.sbt中更新插件版本:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")

修改后重新执行sbt assembly,生成的jar体积就会明显减小,因为Spark的核心依赖已经被排除了。

内容的提问来源于stack exchange,提问作者Ming Gai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:36:08