一、问题

在启动springcloud的gateway模块的时候报错Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

二、问题产生的原因

gateway组件中的 spring-boot-starter-webflux 和 springboot作为web项目启动必不可少的 spring-boot-starter-web 出现冲突。

三、解决方案(任选一种就可以)

3.1 注释pom.xml内容

在gateway的pom文件上注释掉spring-boot-starter-web代码

org.springframework.bootspring-boot-starter-web

3.2修改配置文件

在配置文件上加上

spring:main:web-application-type: reactive

解释:这里面涉及到springboot的启动流程因为spring-boot-starter-webflux包,在springboot启动类型里面表示的就是reactive。我们可以看源码,了解一下springboot启动流程

一步一步点进去

这是springApplication构造方法,我们先看构造方法

点进去

3.2.1通过springboot源码解释

springApplication构造源码(不同版本会有差异,当前版本是2.6.1)

public SpringApplication(ResourceLoader resourceLoader, Class

上面说的META-INF/spring.factories都是在springboot.jar包中,不过BootstrapRegistryInitializer是在spring-cloud-context中。

3.2.2了解getSpringFactoriesInstances方法

随便选一个点进去

private  Collection getSpringFactoriesInstances(Class type, Class[] parameterTypes, Object... args) {ClassLoader classLoader = this.getClassLoader();/** SpringFactoriesLoader.loadFactoryNames(type, classLoader)这里才是核心, *这个方法会扫描所有jar包类路径下 META-INF/spring.factories */Set names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;}