如何通过Shading解决本地运行时Spark与json4s的依赖冲突
关于Shading的适用场景及你的依赖冲突问题解答
核心问题答案
Shading主要针对assembly打包场景,本地直接运行(比如sbt run)时默认不会触发shading逻辑,没法用它解决本地运行时的依赖冲突。
为什么你的Shading规则没生效
你配置的assemblyShadeRules是sbt-assembly插件的专属规则,只有执行sbt assembly打包生成fat jar时,插件才会对指定依赖的字节码进行包路径重命名(把org.json4s改成json4sast)。而本地运行时,程序直接调用仓库里拉取的原始json4s jar包,没有经过shading重命名步骤,所以依赖冲突依然存在,报错自然没解决。
针对你的场景的解决建议
本地运行时解决冲突:
- 用
sbt dependencyOverrides强制统一json4s版本,对齐Spark的3.7.0-M5:
注意要测试sttp的json4s模块是否兼容3.7.0-M5版本,兼容的话冲突就能直接解决。ThisBuild / dependencyOverrides ++= Seq( "org.json4s" %% "json4s-ast" % "3.7.0-M5", "org.json4s" %% "json4s-core" % "3.7.0-M5", "org.json4s" %% "json4s-jackson" % "3.7.0-M5", "org.json4s" %% "json4s-scalap" % "3.7.0-M5" ) - 或者排除sttp json4s模块的传递依赖,改用Spark自带的json4s:
这种方式需要确保sttp能正常使用Spark提供的json4s版本。"com.softwaremill.sttp.client" %% "json4s" % "2.3.0" excludeAll ExclusionRule(organization = "org.json4s")
- 用
打包后运行的冲突解决:
如果你是用assembly打包后运行,需要调整shading规则覆盖所有冲突依赖——当前规则只处理了4.0.3版本的json4s,而Spark依赖的是3.7.0-M5,可以把sttp依赖的json4s全部重命名,避免和Spark版本冲突:ThisBuild / assemblyShadeRules := Seq( ShadeRule .rename("org.json4s.**" -> "shaded.json4s.@0") .inLibrary("com.softwaremill.sttp.client" %% "json4s" % "2.3.0") .inProject )
内容的提问来源于stack exchange,提问作者Rupam Bhattacharjee
相关产品推荐
相关产品推荐

