事情的起因是这样的,一次,本人在现场升级程序,升级完成后进行测试,结果接口调用都报了这么个错误:
大概意思是https接口需要证书校验,这就奇怪了,项目启动加载的是包外的application.properties配置文件,配置文件里没有配置使用https啊。本人马上检查了下包内的application.properties配置文件,发现包内确实配置了https相关的配置项:
明明包外的配置文件优先级高于包内的,为啥包内的一部分配置项起作用了呢,我们了解的配置文件优先级是这样的:
这是为啥呢?后来才了解到除了高优先级覆盖低优先级外,还有一条重要的规则:如有不同内容,高优先级和低优先级形成互补配置。这下才恍然大悟,我包外的配置文件里把https相关的配置项注释掉了,相当于没有这个配置项,但是包内的配置文件有,根据互补原则,包内的这几个配置项起作用了。
问题原因找到了,如何解决呢?要不我把包内的那几个配置项也注释掉,重新打个包?其实不必这么麻烦,通过-Dspring.config.location命令直接指定包外的配置文件就可以了,试了下,果然没有问题了。问题虽然解决了,但是还有些疑问,为啥指定包外的配置文件后就不存在互补情况了呢?通过阅读springboot相关源码,找到了答案:
大概意思是:如果-Dspring.config.location指定了配置文件,则只加载指定的那一个配置文件,如果没有专门指定配置文件则遍历包外、包内相关的配置文件,按照高优先级覆盖低优先级和互补原则进行加载。
弄明白这些问题后,实地部署项目的时候,保险起见还是通过-Dspring.config.location命令直接指定加载的配置文件比较好,避免出现一些不必要的麻烦。