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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:22:34