一、问题
在启动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;}