Springboot项目jar包读取配置文件的优先级

本文详细介绍了SpringBoot服务在jar包启动时如何读取配置文件,包括配置文件的加载优先级,以及不同环境和路径下的配置文件如何覆盖。通过示例解释了`spring.profiles.active`和`spring.config.location`指令的区别,揭示了配置文件的覆盖原则,帮助开发者理解如何灵活管理不同环境的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

问题现象:

问题分析:

springboot服务读取配置文件具有优先级

拓展:

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服务读取配置文件具有覆盖性1

        springboot服务启动时会按优先级搜寻所有的配置文件,而不是搜寻到就停止搜寻了;这意味着:所有配置文件中的属性配置都会被 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-”后面带的单词。

        当指定了配置文件环境之后,--spring.profiles.active=erc,则application-erc.properties的优先级大于application.properties。


spring.profiles.active 和 spring.config.location 区别

--spring.profiles.active 指令用于指定配置文件环境,指定后jar包就可以搜寻并使用指定环境相关的配置文件,对所有搜寻到的文件启动优先级和覆盖原则,如:

    --spring.profiles.active=erc

--spring.config.location 指令用于指定配置文件,指定后jar包就直接使用指定的配置文件;不再搜寻其他的任何配置文件,因此不存在优先级和覆盖原则,如:

    --spring.config.location=application-erc.properties

但也有一种情况需要注意,比如你已经指定了配置文件application-erc.properties,而文件中引用了nacos上的config配置,这种时候nacos的配置优先级最大,会覆盖application-erc.properties中的同名配置

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值