springboot项⽬引⽤外部配置⽂件遇到的问题 踩坑集锦 25(一周一更)

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

问题描述

在搭建springboot项⽬的时候,因为通常情况下,我们会把数据库的⽤户名和密码配置在分组配置⾥⾯,尽管在代码⾥⾯指定了引⼊important.properties,但是分组⾥⾯的配置依然没有⽣效。

image.png

之所以没⽣效的原因是和传统应⽤不同,springboot是以jar包形式运⾏的,在jar包启动后查看⽂件⽬录可以看出,实际上important.properties和jar同级,不在classpath下,因此没办法引⼊进来。

image.png

查阅资料得知,springboot可以在启动时指定外部配置⽂件的路径来⼿动引⼊外部配置⽂件,因此修改启动脚本如下:

image.png

增加引⽤外部配置后发现,代码启动提示缺少app.code等必要配置,但是我的app.code是配置在classpath下的application.properties中的,⽽根据springboot的加载规则,springboot是会加载classpath下的application.properties的,⽽且没有增加外部配置的时候,代码启动没有问题,因此推测是外部配置影响了springboot对配置⽂件的加载.

image.png

问题原因

springboot在启动的时候SpringApplication 将从以下位置加载 application.properties ⽂件,并把它们添加到Spring Environment中:

1、config/application.properties(项⽬根⽬录中config⽬录下)

2、config/application.yml

3、application.properties(项⽬根⽬录下)

4、application.yml

5、resources/config/application.properties(项⽬resources⽬录中config⽬录下)

6、resources/config/application.yml

7、resources/application.properties(项⽬的resources⽬录下)

8、resources/application.yml

例如下⾯的项⽬,application.properties标注数字从⼩到⼤,优先级由⾼到底,⾼优先级的配置会覆盖低优先级的配置。

image.png

Version:0.9 StartHTML:0000000105 EndHTML:0000001338 StartFragment:0000000141 EndFragment:0000001298

但是如果我们在springboot启动的时候指定配置⽂件读取顺序的话,这种默认加载配置就不会进⾏了,

也就说说,springboot只会读取spring.config.location指定的配置⽂件,就不会⾛默认配置了;

image.png

因此当我们在配置了脚本指定spring.config.location为important.properties的时候,springboot就不会再去加载我们项⽬classpath下的application.properties了,导致必要的属性没有加载,致使启动失败。

解决方法

默认加载⽆法⾛,就只能⼿动导⼊application.properties到项⽬⾥⾯了,如下所示:

image.png

总结

默认配置什么情况下会⾛,什么情况下不会⾛在使⽤的时候需要考虑清楚,防⽌踩坑。

猜你喜欢

转载自juejin.im/post/7129743648605880356
今日推荐