Sbt assembly依赖冲突:XMLStandardTypes类重复无法解决
解决sbt clean assembly重复文件冲突问题
问题原因分析
这种仅部分本地机器报错、Jenkins正常的情况,核心是本地环境与CI环境的差异导致:
- 本地依赖缓存损坏:Jenkins通常使用干净缓存或定期清理,而本地Ivy/SBT缓存长期积累可能出现损坏的Jar包,导致解析出的
scalaxb/XMLStandardTypes$class.class内容不一致 - 依赖版本不统一:本地依赖解析时拉取了与Jenkins不同版本的
data-scalaxb-abr_2.11或data-scalaxb-datackedatang_2.11,版本差异引发类文件内容冲突 - 合并策略配置错误:之前的合并策略写法未正确命中目标文件,比如路径匹配错误,或是覆盖了默认策略导致规则未生效
- sbt/插件版本差异:本地使用的sbt版本或sbt-assembly插件版本与Jenkins不一致,不同版本插件对合并策略的处理逻辑存在差异
解决办法
1. 清理本地依赖缓存
彻底清理本地sbt和Ivy缓存,强制重新拉取依赖:
- Linux/Mac执行:
rm -rf ~/.ivy2/cache rm -rf ~/.sbt - Windows执行:
rd /s /q %USERPROFILE%\.ivy2\cache rd /s /q %USERPROFILE%\.sbt
清理完成后重新执行sbt clean assembly
2. 强制锁定依赖版本
在build.sbt中明确指定冲突Jar包的版本,确保本地和Jenkins使用完全一致的依赖:
// 直接指定依赖版本(适用于直接引入的依赖) libraryDependencies ++= Seq( "你的依赖组ID" % "data-scalaxb-abr_2.11" % "具体版本号", "你的依赖组ID" % "data-scalaxb-datackedatang_2.11" % "具体版本号" ) // 用dependencyOverrides强制统一版本(适用于间接引入的依赖) dependencyOverrides ++= Seq( "你的依赖组ID" % "data-scalaxb-abr_2.11" % "具体版本号", "你的依赖组ID" % "data-scalaxb-datackedatang_2.11" % "具体版本号" )
3. 修正合并策略配置
确保合并策略正确命中目标文件,且保留默认规则:
assemblyMergeStrategy in assembly := { // 仅针对冲突的类文件指定合并规则 case PathList("scalaxb", "XMLStandardTypes$class.class") => MergeStrategy.first // 其他文件沿用默认合并策略 case other => val defaultStrategy = (assemblyMergeStrategy in assembly).value defaultStrategy(other) }
注意不要直接覆盖所有合并策略,否则会破坏默认的规则逻辑
4. 对齐sbt及插件版本
检查本地的sbt版本和sbt-assembly插件版本是否与Jenkins一致:
- 在
project/build.properties中指定sbt版本:sbt.version=对应Jenkins使用的版本号 - 在
project/plugins.sbt中指定sbt-assembly版本:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "对应Jenkins使用的版本号")
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

