目录
问题现象:
问题分析:
拓展:
springboot服务读取配置文件具有覆盖性1
springboot服务读取配置文件具有覆盖性2
spring.profiles.active 和 spring.config.location 区别
问题现象:
最近,公司新招了一个高级java工程师在熟悉我们的服务代码,今天这位大佬问到我一些关于jar包启动是读取配置文件的问题:
我:是为了在jar启动时读取这些配置文件。
大佬:jar包中不是已经包含了这些配置文件了吗?
我:jar包中的是项目在开发时设计的配置文件,实际部署后,无论是测试环境还是生产环境,肯定是要修改配置的;如果读取的是封装在jar包的配置文件,那么可以通过从jar中导出配置文件-修改配置文件-导入配置文件到jar包中来实现修改,不过这样做很麻烦,更简单的方法就是直接读取jar包外的配置文件。
大佬:那你是怎么让jar包在启动的时候读取到外部的配置文件的?
我:可以通过jar包的启动命令来指定配置文件:
nohup java -jar $ROOTDIR/服务jar包 --spring.profiles.active=erc > log/test.log 2>&1 &
大佬:你是指 --spring.profiles.active=erc 这个指令吧,但这个指令只是指定了环境,读取的是jar包内的application-erc.properties配置文件,并不是指定jar包外的那个application-erc.properties配置文件,你确定修改jar包外的那个application-erc.properties配置文件之后能生效?
我:当然是能生效的!我们一直都是这么用的吖!
大佬:真的么?我是不太信的,估计因为你们在项目代码中配置了什么才能生效的吧!
我:......(一时间语塞,因为大佬都这样说了,搞得我都有些不确定了)
问题分析:于是,我马上上网查询了相关资料,终于了解到,原来这是涉及到了“Springboot项目jar包读取配置文件的优先级”!
springboot服务读取配置文件具有优先级
优先级按顺序依次是:
1、jar包所在目录中的/config文件夹下的配置文件:
2、jar包所在目录中的配置文件:
3、jar包内classes目录中的/config文件夹下的配置文件:
对应开发时resource目录下的config文件夹下的配置文件:
4、jar包内classes目录中的配置文件:
对应开发时resource目录下的配置文件:
至此,终于明白了为什么修改jar包外的那个application-erc.properties配置文件可以生效了!!!
拓展:
现在,我们已经知道了springboot服务读取配置文件是具有优先级的;这里还要再延伸一下说说基于优先级导致的一个关于配置文件覆盖的知识:
springboot服务读取配置文件具有覆盖性1springboot服务启动时会按优先级搜寻所有的配置文件,而不是搜寻到就停止搜寻了;这意味着:所有配置文件中的属性配置都会被 springboot服务读取并使用到;且当这些配置文件中具有相同属性配置时,优先级高的配置文件中的属性配置会覆盖优先级低的。
举例:
1、jar包所在目录中的/config文件夹下的配置文件application-erc.properties中有属性配置:
photo-file.extension=jpg
2、jar包所在目录中的的配置文件application-erc.properties中有属性配置:
photo-file.extension=png
photo-file.local.path=C:/
1和2中具有相同属性配置photo-file.extension,但1优先级大于2;所以最终,Springboot服务使用的属性配置:
photo-file.extension=jpg
photo-file.local.path=C:/
springboot服务读取配置文件具有覆盖性2
覆盖性的另一个特点,体现在配置文件环境,如我们常用的 dev环境\test环境\prod环境,对应的配置文件是:application-dev.properties、application-test.properties、application-prod.properties。application-可以认为就是“application-”后面带的单词。
当指定了配置文件环境之后,如--spring.profiles.active=erc,则application-erc.properties的优先级大于application.properties。
spring.profiles.active 和 spring.config.location 区别
--spring.profiles.active 指令用于指定配置文件环境,指定后jar包就可以搜寻并使用指定环境相关的配置文件,对所有搜寻到的文件启动优先级和覆盖原则;
--spring.config.location 指令用于指定配置文件,指定后jar包就直接使用指定的配置文件;不再搜寻其他的任何配置文件,因此不存在优先级和覆盖原则。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)