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

SBT Assembly中assemblyShadeRules未生效:Gson依赖未被Shade

Gson Shade配置未生效的排查与解决

先澄清一个误区

Shade是sbt-assembly打包阶段的字节码修改操作,不会自动修改你源码里的import语句。你仍然需要在代码中写import com.google.gson.{Gson, JsonArray, JsonObject},打包后的Jar包内,字节码里的类引用会被替换为my_gson路径,IntelliJ里的import显示不变是正常的,不用修改源码。

针对Jar包中Gson路径未变更的问题,按以下步骤排查:

  1. 升级sbt-assembly版本
    你当前使用的1.2.0版本较老,存在ShadeRule处理的已知问题。将plugins.sbt中的插件版本升级到最新稳定版,比如:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.3.0")

升级后执行sbt clean assembly重新打包。

  1. 检查ShadeRule的配置细节
    确保规则中的依赖坐标完全匹配:你的inLibrary参数"com.google.code.gson" % "gson" % "2.8.9"是正确的,但可以尝试去掉版本号,让插件自动匹配项目中的依赖版本:
assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.google.gson.**" -> "my_gson.@1")
    .inLibrary("com.google.code.gson" % "gson")
    .inProject
)
  1. 排除其他依赖中的Gson冲突
    spark-bigquery-with-dependencies可能也依赖了Gson,导致未被shade的Gson混入Jar包。在libraryDependencies中给该依赖添加排除规则:
"com.google.cloud.spark" %% "spark-bigquery-with-dependencies" % "0.26.0" % "provided" exclude ("com.google.code.gson", "gson")
  1. 清理缓存后重新打包
    执行sbt clean assembly,确保使用全新的编译和打包流程,避免增量编译的缓存干扰。

  2. 验证MergeStrategy是否冲突
    暂时注释掉assemblyMergeStrategy配置,重新打包测试:

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

如果打包后Shade生效,再逐步调整MergeStrategy,避免影响Shade操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:45:34