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路径未变更的问题,按以下步骤排查:
- 升级sbt-assembly版本
你当前使用的1.2.0版本较老,存在ShadeRule处理的已知问题。将plugins.sbt中的插件版本升级到最新稳定版,比如:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.3.0")
升级后执行sbt clean assembly重新打包。
- 检查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 )
- 排除其他依赖中的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")
清理缓存后重新打包
执行sbt clean assembly,确保使用全新的编译和打包流程,避免增量编译的缓存干扰。验证MergeStrategy是否冲突
暂时注释掉assemblyMergeStrategy配置,重新打包测试:
// assemblyMergeStrategy in assembly := { // case PathList("META-INF", _*) => MergeStrategy.discard // case _ => MergeStrategy.first // }
如果打包后Shade生效,再逐步调整MergeStrategy,避免影响Shade操作。
内容的提问来源于stack exchange,提问作者stephen
相关产品推荐
相关产品推荐

