SBT Assembly打包时SLF4J重复文件错误求助
解决SBT Assembly打包时SLF4J重复文件错误
先明确:provide scope解决不了这个问题
provide scope是告诉SBT「这个依赖由运行容器提供,打包时不要包含」,但你的问题根源是两个不同的SLF4J jar包里有同路径但内容不同的module-info.class文件,不是依赖冗余。就算把某个SLF4J依赖设为provide,只要还有两个jar带这个冲突文件,问题依然存在。
正确解决步骤
1. 彻底统一SLF4J版本
先确保项目里所有SLF4J相关依赖版本完全一致,混合版本很容易导致文件内容差异。用sbt dependencyTree命令查看依赖树,找出哪个依赖偷偷引入了旧版本的slf4j-api,然后强制统一:
在build.sbt里加版本强制:
ThisBuild / dependencyOverrides += "org.slf4j" % "slf4j-api" % "2.0.9" ThisBuild / dependencyOverrides += "org.slf4j" % "slf4j-nop" % "2.0.9"
之后执行sbt clean assembly试试。
2. 修复Assembly合并策略(关键)
你原来的合并策略里其实已经写了丢弃这个文件,但可能是缩进格式错了导致规则没生效。看你原代码里第一个case的MergeStrategy.discard缩进不对,应该和case对齐,否则这个规则等于没写。修正后的合并策略:
assembly / assemblyMergeStrategy := { case PathList("META-INF", "versions", "9", "module-info.class") => MergeStrategy.discard case PathList("META-INF", xs @ _*) => MergeStrategy.discard case "module-info.class" => MergeStrategy.discard case x => MergeStrategy.first }
如果统一版本后还是有冲突,也可以针对SLF4J的这个文件单独指定保留第一个版本:
assembly / assemblyMergeStrategy := { case PathList("META-INF", "versions", "9", "module-info.class") if _.contains("slf4j") => MergeStrategy.first case PathList("META-INF", xs @ _*) => MergeStrategy.discard case "module-info.class" => MergeStrategy.discard case x => MergeStrategy.first }
3. 检查依赖树确认版本统一
执行sbt dependencyTree | grep slf4j,确保所有SLF4J相关依赖都是2.0.9版本,没有其他版本混进来。如果还有旧版本,说明版本强制没生效,得调整依赖声明或者dependencyOverrides。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

