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
相关产品推荐
相关产品推荐

