Scala 2.11+SBT环境下Guava版本冲突异常消失问题求助
这问题我在维护SBT老项目时碰到过好几次,属于典型的依赖缓存/解析机制“玄学”问题,结合你的场景,主要有这几个可能的原因:
项目级解析缓存未清理
SBT会在项目的target/resolution-cache目录中保存依赖解析的结果(包括依赖树、冲突解决规则等)。当你升级Guava到26.0-jre并成功构建后,这个缓存已经记录了新依赖与Guava兼容的状态。回滚build.sbt到19.0时,如果没删除target目录,SBT会直接复用之前的解析缓存,而没有重新计算依赖冲突。此时虽然build.sbt指定的是19.0,但SBT仍按照之前的兼容逻辑处理,导致冲突暂时消失。你可以尝试删除项目根目录下的target文件夹,再重新执行sbt clean compile,冲突大概率会重现。IDE类加载/编译缓存残留
如果你是通过IDE(比如IntelliJ IDEA)运行项目,IDE本身会缓存编译后的类文件和依赖解析结果。升级到26.0后,IDE已经加载了兼容的类;回滚build.sbt并重启项目时,IDE可能没有彻底清理缓存,仍在复用之前编译好的兼容类,从而掩盖了冲突。解决方法是执行IDE的缓存清理操作(比如IntelliJ的File -> Invalidate Caches... -> Invalidate and Restart),再重新构建项目。新依赖的实际兼容性超出声明范围
很多时候,第三方依赖会在pom.xml或build.sbt中声明对高版本库的依赖,但实际代码并没有用到该版本特有的API。你升级到26.0时只是解决了版本冲突的表面问题,而回滚到19.0后,由于新依赖本身可以兼容19.0的Guava,SBT的依赖驱逐机制(默认会处理版本冲突,选择合适的版本)自动完成了兼容,冲突自然消失。这种情况下,你可以检查新依赖的文档或源码,确认它是否真的需要高版本Guava。Ivy元数据缓存的延迟更新
Ivy(SBT默认的依赖管理器)会在~/.ivy2/cache中缓存依赖的元数据(比如POM文件、依赖声明等)。当你升级Guava到26.0时,Ivy更新了相关元数据;回滚到19.0后,Ivy可能仍在使用更新后的元数据来解析依赖,误以为新依赖与19.0兼容。你可以尝试删除~/.ivy2/cache/com.google.guava目录,再重新构建,看冲突是否重现。
内容的提问来源于stack exchange,提问作者Lenny D.

