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

引入自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:42:31