问题场景:在新建一个Spring Boot Module(Spring Boot 版本2.1.5-RELEASE)时,将application.properties文件修改为application.yml,然后进行相关配置。
其中配置了eureka.client.service-url.defaultZone:localhost:8095/eureka/ 然后启动。但是在启动时 连接的defaultZone 却是 eureka:8095/eureka/ 。
然后新建了一个配置文件application-local.yml 使用相同的配置,然后切换active到local,再启动,发现可以正常的;连接到localhost:8095/eureka/。
通过跟踪SpringBoot 的启动,最后发现在为EurekaClientConfigBean 绑定配置文件的属性时,application.yml中的配置被application.properties中的配置覆盖了
可以看到,当存在多个配置文件时,会执行循环,当查找到第一条有效配置时就退出循环,而当使用application.yml文件时
而正常的source结构应该时这样的,所以问题应该是出在,在初始化Binder的context时,多加进了一个application.properties。
通过该代码可得知,properties的加载器是在yaml加载器之前的,所以如果在同目录下,会先加载application.propertis再加载application.yml,也就解释了为什么application.propertis 文件会在application.yml之前被读取到了。
最后通过搜索所有的依赖类,终于在引入的stater包 找到了相关文件 application.properties.原来是因为该包中含有application.properties文件,而当我们的项目依赖该包时,该配置文件依然生效,并且优先于我们的application.yml加载。从而导致我们的配置失效。
解决方案:
1.指定profile-active。Spring会在查找配置文件时,加上profile-active后缀。
2.删除依赖包中的application.properties
3.application.yml 更改为application.properties 直接覆盖依赖包的配置