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

同一提交构建的两个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的加载顺序,原本依赖加载顺序被掩盖的循环依赖问题在特定顺序下暴露出来

解决方案

  1. 修复Bean之间的循环依赖,从根源消除依赖环
  2. 将所有protoc生成文件归属到指定包下,确保不同环境构建的Jar内文件顺序一致,避免加载顺序差异引发的问题

内容的提问来源于stack exchange,提问作者duckydude20

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:33:26