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

如何通过Shading解决本地运行时Spark与json4s的依赖冲突

关于Shading的适用场景及你的依赖冲突问题解答

核心问题答案

Shading主要针对assembly打包场景,本地直接运行(比如sbt run)时默认不会触发shading逻辑,没法用它解决本地运行时的依赖冲突。

为什么你的Shading规则没生效

你配置的assemblyShadeRules是sbt-assembly插件的专属规则,只有执行sbt assembly打包生成fat jar时,插件才会对指定依赖的字节码进行包路径重命名(把org.json4s改成json4sast)。而本地运行时,程序直接调用仓库里拉取的原始json4s jar包,没有经过shading重命名步骤,所以依赖冲突依然存在,报错自然没解决。

针对你的场景的解决建议

  1. 本地运行时解决冲突:

    • 用sbt dependencyOverrides强制统一json4s版本,对齐Spark的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模块是否兼容3.7.0-M5版本,兼容的话冲突就能直接解决。
    • 或者排除sttp json4s模块的传递依赖,改用Spark自带的json4s:
      "com.softwaremill.sttp.client" %% "json4s" % "2.3.0" excludeAll ExclusionRule(organization = "org.json4s")
      
      这种方式需要确保sttp能正常使用Spark提供的json4s版本。
  2. 打包后运行的冲突解决:
    如果你是用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:46:10