同一提交构建的两个Jar表现异常:一个正常一个报循环依赖错误
同一Git提交构建Jar出现Spring循环依赖差异问题的排查与解决
问题现象
- 基于同一Git提交,本地Windows环境(OpenJDK Temurin 17.0.5+8)构建的Jar运行正常;Ubuntu流水线环境(Temurin 17.0.8+7)构建的Jar启动时触发Spring循环依赖错误,报错指向Bean
repeaterAutoConfigHandler,涉及hubMetaProcessor、connectionInfoCache、hubProcessor等Bean - 已在
application.properties中设置spring.main.allow-circular-references=true,且给多个@Autowired字段添加@Lazy注解,流水线Spring健康检查通过,但启动仍报错
排查过程
- 对比两个Jar:IntelliJ、WinMerge解压后内容及二进制均一致;
jar xf和7zip解压无差异,但Jar二进制直接对比、sha256哈希值存在不同 - 本地执行
gradlew clean bootJar多次构建,结果均正常;流水线构建时从Maven Central拉取依赖无缓存 - 复现场景:启用Gradle缓存后,即使使用同一Java版本构建,也会生成有问题的Jar,共同特征是复用了缓存的protoc生成文件
根因分析
- 项目中部分protoc生成文件未归属到任何包下,导致Linux环境下Jar内的文件顺序与Windows环境不一致
- Jar内文件顺序的变化影响了Spring Bean的加载顺序,原本依赖加载顺序被掩盖的循环依赖问题在特定顺序下暴露出来
解决方案
- 修复Bean之间的循环依赖,从根源消除依赖环
- 将所有protoc生成文件归属到指定包下,确保不同环境构建的Jar内文件顺序一致,避免加载顺序差异引发的问题
内容的提问来源于stack exchange,提问作者duckydude20
相关产品推荐
相关产品推荐

