1.前言
当你需要使用框架的某一个新功能时,往往需要面临着版本升级,版本升级无形之中会给业务系统带来一定的故障。秉着"稳定运行"的原则,系统维护者一般都不太愿意去进行版本升级,除非迫不得已......
我很庆幸地迎来了一次"迫不得已"的版本升级机会,需要将SpringBoot版本从1.5.x升级到2.x版本,整个过程基本都是更换包路径,还算是比较顺利,然后......
如果这么顺利,你的内心应该是忐忑的,俗话说的好:"不怕出问题,就怕不出问题",果不其然本地正常启动,到了测试环境却无法正常启动,很多@Value注解对应的占位符属性都无法解析。
2.系统背景介绍
2.1 升级前
业务系统中存在某些默认配置,这些配置是存放在配置文件中,也就是系统中除了默认的application.yml文件外,还存在着很多其它的yml文件
默认情况下只会读取名称为application的配置文件
对于这种情况就需要在SpringBoot启动的过程中手动设置spring.config.name
对应的值
public static void main(String[] args) {
ConfigurableEnvironment environment = new SpringApplicationBuilder(PropertiesApplication.class)
.properties("spring.config.name=test,application")
.run(args)
.getEnvironment();
log.info("config path:" + environment.getProperty("config.path"));
log.info("spring application name:" + environment.getProperty("spring.application.name"));
}
测试环境应用的启动方式:java -jar application.jar --spring.config.location=配置文件的路径
可以看到应用启动通过spring.config.location
参数指定了配置文件的路径,再来看下官方文档对spring.config.location
的解读:
默认情况下,配置文件的路径为classpath:/,classpath:/config/,file:./,file:./config/
,配置读取顺序为file:./config/,file:./,classpath:/config/,classpath:/
,如果自定义配置文件路径,配置文件读取顺序为自定义文件路径,file:./config/,file:./,classpath:/config/,classpath:/
2.2升级后
将SpringBoot升级到2.x版本后,以同样的方式java -jar application.jar --spring.config.location=配置文件的路径
启动程序,发现应用启动报错,无法解析@Value注解对应的占位符属性。
解铃还须系铃人,既然错误是升级SpringBoot版本带来的,那么官方文档就会给出相关说明:
spring.config.location
属性从字面上很容易看出来是重新定义了配置文件的路径,不包含默认的路径;spring.config.additional-location
属性从字面上很容易看出来是指定了额外的配置文件路径,包含默认的路径。
3.解决方案
经过以上分析很容易得出解决方案就是使用spring.config.additional-location
属性来代替spring.config.location
属性,应用启动方式修改为:java -jar application.jar --spring.config.additional-location=配置文件的路径