引入自定义Spring Boot框架为依赖时项目启动报错排查
问题根因
- 版本不兼容是核心诱因:my-core框架使用Spring Boot 2.6.7 + Spring Cloud 2021.0.2(适配对应Sleuth版本),但子项目使用Spring Boot 2.6.3。Maven依赖仲裁后会出现Spring核心包、Spring Boot自动配置包、Sleuth依赖包版本混存,直接导致Sleuth的Brave链路追踪Bean初始化链路断裂。手动排除部分starter的操作没有解决全量依赖版本不一致的问题,传递依赖里依然残留大量版本不匹配的包。
- 循环依赖触发Bean创建失败:Spring Boot 2.6及以上版本默认禁止循环引用。Sleuth的自动配置在初始化链路追踪Bean时,会提前触发Controller的实例化,而microservice3Controller依赖的restTemplate还未完成初始化,触发
BeanCurrentlyInCreationException。 - Tomcat启动失败是衍生异常:前面的Spring Bean创建失败直接导致应用上下文初始化中断,内嵌Tomcat启动失败只是上层表现,和Tomcat本身配置无关。
- 框架打包方式错误:my-core当前没有配置spring-boot-maven-plugin的classifier,默认打出来的是可执行fat jar,作为依赖引入时存在类加载、依赖传递异常的问题。
解决方案
1. 统一全栈依赖版本
所有依赖my-core的子项目,必须和my-core使用完全一致的Spring Boot、Spring Cloud版本,禁止出现版本差。
修改子项目microservice3的parent配置,将Spring Boot版本对齐到2.6.7:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.7</version> <relativePath /> </parent>
删除子项目dependencies中重复声明的spring-boot-starter、spring-boot-starter-web、spring-boot-starter-web-services依赖,这些已经在my-core中引入,版本统一后不需要重复声明,也不需要手动加exclusion排除。
2. 修复my-core的打包配置
修改my-core的pom.xml build节点,给spring-boot-maven-plugin增加classifier配置,同时打出可执行包和供外部依赖的普通jar包,避免fat jar作为依赖引入的类加载问题:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
修改完成后,在my-core项目根目录执行mvn clean install,重新将包安装到本地Maven仓库。
3. 解决循环依赖问题
优先从代码结构解耦,不推荐直接放开循环依赖开关:
- 把RestTemplate的声明独立到单独的配置类,不要在Controller的初始化逻辑、构造函数里提前触发未初始化完成的Bean加载:
@Configuration public class CommonConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
- 检查Controller代码,不要出现自己注入自己、或者A依赖B、B依赖A的显式循环逻辑。
- 如果临时需要兼容老代码,可以在application.yml中放开循环依赖限制(仅临时方案,最终还是要解耦):
spring: main: allow-circular-references: true
4. 验证依赖正确性
在子项目根目录执行mvn dependency:tree,检查输出的依赖树:
- 所有
org.springframework.boot前缀的依赖版本必须统一为2.6.7 spring-cloud-starter-sleuth相关依赖版本必须为2021.0.2- 不存在2.6.3版本的Spring相关残留包
确认依赖无问题后重新启动子项目即可。
内容的提问来源于stack exchange,提问作者SNB
相关产品推荐
相关产品推荐

