1. 启动时报错信息中含有nacos等报错信息
因为springboot单体项目不能有cloud相关内容报错,所以需要注解掉spring-cloud相关依赖,示例如下
<dependency>
<groupId>org.springjmis</groupId>
<artifactId>jmis-core-boot</artifactId>
<version>3.1.0</version>
<exclusions>
<exclusion>
<groupId>org.springjmis</groupId>
<artifactId>jmis-core-cloud</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</exclusion>
</exclusions>
</dependency>
注意:某些高度封装的框架中父-子-孙嵌套依赖,而我不需要某个孙依赖,可以使用 <exclusion>标签进行嵌套深层过滤,如以上示例展示,个别依赖时属于孙依赖甚至玄孙依赖
2. Maven爆红,依赖找不到
排除掉cloud相关报错,开始解决Maven爆红问题,当使用clean无法正常clean,对于缺失的依赖在maven仓库中查找,手动补全
3. 启动报错:org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class
该问题卡我最久,该报错往往搭配Caused by: java.lang.NoClassDefFoundError: springfox/documentation/common/ClassPresentInClassPathCondition 类似class文件找不到异常,最初的排查逻辑为缺失依赖, pom中引入了springfox相关依赖后,确定项目结构中有了对应依赖,依旧有类似错误出现,开始考虑版本冲突问题,springfox下有多个类型依赖,报错信息随着我改版本号一直变动,本质上的报错还是以上异常,但是类变了,开始考虑是否不仅仅是springfox相关依赖的问题;
是否有某个功能依赖A和它产生关联,我变动了springfox,但是A没有变,它需要找和他有关的springfox版本的编译文件,随后百度,定位为 knife4j-spring-boot-starter 依赖。
引入后依旧出现NoClassDefFoundError、Failed to read candidate component class等字眼报错,百度相关字眼给出的答案是项目的spring版本时spring3,而自己JDK版本是1.8,不兼容,需要降低JDK版本。
该回答让我去确认了我的spring和springBoot版本,写一个测试方法使用SpringVersion进行输出,
String version = SpringVersion.getVersion();String version1 = SpringBootVersion.getVersion();
输出的版本分别为5.x,2.4x,他是适配1.8的,排除这个情况,随后我进入knife4j-spring-boot-starter依赖,也就是com.github.xiaoymin去看他的文档,是否我引入的springfox和它版本冲突,
最后确定为我的springfox相关依赖版本为2.10.5。对应的knife4j应该是2.0.9.进行启动NoClassDefFoundError等报错彻底消失,不会再像之前反复出现。
最后的报错为关键字眼为:knife4j、application,结局方法为在yml文件中引入 【knife4j: enable: true】,启动继续报错,报错信息为Consider defining a bean of type 'springfox.documentation.schema.TypeNameExtractor' in your configuration.
该报错结局方法为启动类增加注解@ComponentScan({"springfox.documentation.schema"}),项目启动成功
总结: 此次问题简单来说分为几个步骤1.移除cloud相关依赖 2.解决依赖冲突,选择合适版本,对于缺失的引入,冲突的确定合适版本
因为以往欠缺重头自己独立去解决一个把公司高度封装的微服务往一个其他公司开源单体项目迁移经验,所以卡了两天,随着处理思路也越来越清晰,注意的是,频繁出现某个报错如我碰见的Failed to read candidate component class等,引入多个依赖仍反复出现,就要开始跳出依赖是不是没正常下载手动粘贴依赖文件夹的逻辑了,
开始考虑是否依赖相互引用的问题,比如knife4j就是底层用的springfox,要选择恰当的版本;
疑问:我这个微服务迁移,没用到knife4j,这个开源的框架中我也没发现knife4j,为什么它疯狂报错都是springfox和knife4j的,然后我还给yml中又加了配置。我初步怀疑是我公司的封装框架里面可能已经用到了knife4j等,我拍出的依赖时cloud等其他明面上的嵌套、报错,但是底层应用得重新布
二更:启动成功后,访问任何接口都是404,好家伙,我初步怀疑是迁移的公司框架的springJmis封装了鉴权微服务模块,我在pom中进行了排除,没效果,理一下思路,迁移的是单体的,微服务模块原本都是能通过localhost访问接口的,想法出错了,看了404输出信息去公司框架看了代码,代码是异常监听抛出的,同事建议是进行输出,然后将框架模块重新打包,然后看输出。太费事费劲。最后理一下思路,一步步排查,首先看看Bean到底注册上没有
,网上搜了一段启动类代码:
ConfigurableApplicationContext run = SpringApplication.run(DataSourceApplication.class, args);
boolean a = run.containsBean("biExceptionHandleController");
输出后用来判断是否Bean注册成功,我输出一直时false,挪到正常项目中还是,所以我排除该方法。
然后无意发现在启动类启动时,点击服务-控制台右侧的端点,可以快速看到Bean情况,然后发现我的控制层就是没注册上,那么问题就从怀疑框架底层鉴权变成了怎么让控制层被spring扫描注册上,使用如下注解即可:
随后采用@ComponentScan(basePackages = {"springfox.documentation.schema","xxxx.controller","xxxx.service"})
问题解决
注解形式解决问题。
最后的完整pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>gfdp</artifactId>
<groupId>cn.com.taiji</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.taiji.gfdp</groupId>
<artifactId>datasource</artifactId>
<dependencies>
<dependency>
<groupId>org.springjmis</groupId>
<artifactId>jmis-core-boot</artifactId>
<version>3.1.0</version>
<exclusions>
<exclusion>
<groupId>org.springjmis</groupId>
<artifactId>jmis-core-cloud</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.simpleframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-cells</artifactId>
<version>23.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version> <!-- 请替换为最新版本 -->
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version> <!-- Make sure to use the appropriate version -->
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-core</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webflux</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-common</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-schema</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spi</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-web</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-oas</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>2.10.5</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-schema</artifactId>
<version>2.10.5</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itextpdf</artifactId>-->
<!-- <version>5.5.10</version>-->
<!-- <scope>system</scope>-->
<!-- <systemPath>D:/apache-maven-3.6.3(1205)/apache-maven-3.6.3(1205)/maven_hangcai/com/itextpdf2/itextpdf/5.5.13/itextpdf-5.5.13.jar</systemPath>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.dm</groupId>-->
<!-- <artifactId>Dm7JdbcDriver18</artifactId>-->
<!-- <version>1.8</version>-->
<!-- <scope>system</scope>-->
<!-- <systemPath>${project.basedir}/src/lib/Dm7JdbcDriver18.jar</systemPath>-->
<!-- </dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>