本地开发环境是ubuntu24.04,我安装了IDEA24.03,springboot项目 中,图形...
बनाया गया: 9 जनवरी 2026
बनाया गया: 9 जनवरी 2026
本地开发环境是ubuntu24.04,我安装了IDEA24.03,springboot项目 中,图形界面执行maven/install,会打包一个jar文件,部署在远程服务器ubuntu24.04系统中以docker形式启动,报错循环依赖了,代码中使用的是自动注入形式。
我本地还有一套开发环境是window10系统,也安装了IDEA24.03,springboot项目 中,图形界面执行maven/install,会打包一个jar文件,部署在远程服务器ubuntu24.04系统中以docker形式启动,却没有循环依赖的报错,可以正常启动,使用的是同一套代码,使用的是自动注入形式。
一个问题需要说明一下,开发环境ubuntu24.04系统,使用IDEA启动没有报错,但打包 后再部署到服务器会报错,那么只有部署的时候我才知道哪里出现循环依赖了,需要 添加@Lazy注解,这成本有点大,提前看不出来.
IDEA在两个开发环境使用的Maven 都 是IDEA自带的 Bundled(Maven 3)
你这个现象的关键点其实有两条:
java -jar 的方式/配置并不完全一致。下面给你一套“最高命中率”的排查路径和“怎么提前在本地复现”的做法。
IDEA 启动时,你可能无意中启用了某个 profile 或者 VM options / 环境变量,而 docker 里没有。
你重点检查这些(两边都对齐):
SPRING_PROFILES_ACTIVE--spring.profiles.active=...SPRING_CONFIG_LOCATION / SPRING_CONFIG_ADDITIONAL_LOCATION/config 或传了 -Dspring.config.location=...application.yml / application-*.yml 在服务器镜像里是否“多了一份”或“覆盖了一份”特别关注这两个属性:
spring.main.allow-circular-references
true,IDE 就不会报;但部署时没这个配置就会报。spring.main.lazy-initialization
✅ 建议你立刻做一件事:
在 IDE 里不要用“Run Application”的方式验证了,改成用和服务器一样的方式启动 jar(见第三部分)。
即使 Maven 是 IDEA bundled,同一套代码在不同机器解析依赖仍然可能不同,常见原因:
~/.m2/settings.xml 不同(镜像源/私服不同,可能导致拿到不同的 SNAPSHOT/变体)SNAPSHOT 或版本范围(如 [1.0,)),两台机器“此刻”解析到的版本可能不同.m2 缓存里 Windows 那台恰好缓存了旧版本,Ubuntu 那台拉了新版本(或者相反)✅ 你按下面顺序对齐最有效:
(a) 对齐 JDK:
在两台开发机分别确认三件事完全一致:
mvn 时用的 JAVA_HOME用命令看最直观(在项目目录):
java -versionmvn -v(重点看 “Java version” 那行)(b) 锁定依赖:
如果你没有用 Maven Wrapper,强烈建议加上(mvn -N wrapper:wrapper),并且:
mvn -q help:effective-pom(两台输出对比,看看最终版本是否一致)mvn -q dependency:tree -Dincludes=org.springframework(看 Spring 相关最终落地版本)你不需要马上全对比,只要先确认 Spring Boot / Spring Framework 的最终版本两边是不是一样。只要不一样,你现在的一切“玄学差异”就解释通了。
这里给你几个最常见机制(按概率排序):
@Configuration / @Bean / @Component 在 prod 才生效,导致新增依赖环@ConditionalOnProperty 在部署时打开了某条链路你目标是:在 Ubuntu 开发机本地,模拟服务器 docker 的启动方式。
在 Ubuntu 开发机上,打包后不要用 IDEA 启动,改成:
mvn -DskipTests clean package(或 install)java -jar target/xxx.jar并且尽量把 docker 里的环境变量也带上,比如:
SPRING_PROFILES_ACTIVE=prod java -jar target/xxx.jarjava -jar target/xxx.jar --spring.profiles.active=prod这样你就能在本地直接看到循环依赖的报错堆栈,不用等部署。
在 Ubuntu 开发机上直接 docker build && docker run(和服务器 Dockerfile 一样),启动就能复现。
你现在是“自动注入形式”(很多是字段注入 @Autowired),这类最容易把环藏得很深。
final 字段更稳加一个最简单的冒烟测试:
@SpringBootTestcontextLoads()然后把 CI 或本地 mvn test 跑起来。
这样不需要部署,只要依赖环存在,测试阶段就会失败(前提是别开懒初始化掩盖它)。
@Lazy / allow-circular-references=true@Lazy 是“缓解”,不是“修复”spring.main.allow-circular-references=true 更像“退回旧行为”,不建议长期依赖(尤其生产)java -jar 启动(带上服务器同款 profile/环境变量),看能不能本地直接复现mvn -v(Java version)和 Spring Boot/Spring Framework 最终版本是否一致allow-circular-references / lazy-initialization 只在 IDE 的配置里生效如果你愿意把下面任意一项贴出来(不需要全贴),我可以直接帮你把差异点定位到“到底是哪条链路导致循环依赖”以及“为什么只在部署时触发”:
SPRING_*)mvn -v 输出(重点 Java version)application.yml 里与 profile 相关的片段(尤其 spring.main.*)