jar包启动时,读取配置文件优先顺序
在项目开发完成后,将其部署至生产环境时,调整配置文件几乎是必不可少的环节。通常,.properties或.yml文件默认会被打包进JAR文件内部,若需修改则必须重新打包,这种方式显然缺乏灵活性。值得庆幸的是,Spring Boot框架的设计者早已预见到这一需求,为我们规划了多个外部配置文件的读取位置。在应用启动过程中,Spring Boot会遵循一个明确的优先级顺序,自动扫描并加载这些指定位置的application.properties或application.yml文件。
虽然我们习惯将默认配置文件放置在项目的resources目录中,但这仅仅是配置管理流程的起点。
Spring Boot读取配置文件的优先级顺序
Spring Boot会按照以下优先级顺序(从高到低)来查找并加载配置文件:
- 1. 当前目录下的
/config子文件夹 - 2. 当前目录(JAR包所在目录)
- 3. classpath下的
/config文件夹 - 4. classpath根目录下


如何理解“当前目录”?
这里提到的“当前目录”,特指你执行ja va -jar启动命令时所在的系统目录。例如,如果你编写了一个start.bat批处理脚本用于启动JAR应用,并通过双击运行它,那么“当前目录”即为该.bat脚本文件所在的文件夹。
理解了这一概念后,配置外部文件就变得十分直观。默认打包进JAR内部的配置文件,实际上位于优先级最低的第四级(即classpath根目录下)。因此,你只需将需要修改的配置文件副本,放置到JAR包所在的同级目录,或者更优的方案——放入该目录下的config子文件夹内,Spring Boot在启动时便会优先读取这些外部配置。
这里存在一个关键机制:所有这四个位置的配置文件都会被加载,高优先级配置文件中定义的属性会覆盖低优先级中的同名属性。这形成了一种非常实用的“配置互补”模式。举例来说,如果高优先级文件中仅设置了数据库连接参数,而低优先级文件中还包含日志配置,那么最终生效的配置将是两者的合并——数据库连接信息取自高优先级文件,日志配置则保留自低优先级文件。
除了依赖上述默认的扫描顺序,你还可以在应用启动时,通过命令行参数spring.config.location直接指定一个外部配置文件的完整路径,此方式拥有最高的优先级。这在项目已打包完成,需要临时指定特定配置的场景下尤为有用:
ja va -jar your-application.jar --spring.config.location=D:/my-config/application.yml
总结
熟练掌握Spring Boot配置文件的加载顺序与优先级,是实现应用灵活部署与高效运维的关键。其设计核心体现了“约定优于配置”与“外部化配置”的理念,通过清晰的优先级规则与互补覆盖机制,既保障了开箱即用的便捷性,又为生产环境下的个性化定制提供了充分空间。清晰理解从/config子目录、到JAR同级目录、再到classpath内部的这条扫描路径,开发者便能轻松实现无需修改JAR包内容即可动态调整应用配置与行为的目标。
