部署时指定配置文件
1. Spring Boot的配置文件来源
Spring Boot在启动过程中会从多个来源加载配置,并将这些来源的配置信息进行合并,最终形成一套完整的运行时配置。主要的配置来源包括:
- resources目录
- 命令行参数
- 环境变量
- 配置中心(可选)
--xxx
SPRING_XXX
当应用启动时,Spring Boot会自动整合上述所有配置源,按优先级顺序覆盖相同配置项。
Spring Boot具有默认的配置文件搜索路径,其查找顺序即为优先级从高到低:
- ./config/ —— 与JAR包同级的config目录
- ./ —— JAR包所在目录
- classpath:/config/ —— 类路径下的config文件夹
- classpath:/ —— 类路径根目录
这意味着,如果你有一个外部配置文件命名为:
application.yml
并将其放置于:
jar同级 或 同级config目录
则无需任何额外参数即可被自动识别和加载。
要激活特定环境的配置,只需将对应配置文件放入以下位置之一:
jar同级 或 同级目录/config/application-xxx.yml
系统会自动完成加载过程,无需显式声明路径。激活操作可通过如下方式触发:
--spring.profiles.active=xxx
若配置文件不在默认路径中,则需要通过以下两个参数告知Spring Boot配置位置:
- --spring.config.location:用于替换默认的搜索路径
- --spring.config.additional-location:用于追加额外的搜索路径,不干扰原有路径
spring.config.location
spring.config.additional-location
2. 常见加载配置文件的方式
① 使用 --spring.profiles.active 指定激活的环境配置,实现不同环境间的切换。例如:
java -jar app.jar --spring.profiles.active=prod
该命令的效果是启用名为:
application-prod.yml
的配置文件,常用于区分开发、测试、生产等环境。
--spring.profiles.active
② 使用 --spring.config.name 参数(一般不推荐)可以自定义配置文件的基本名称,默认值为:
application
例如,若你的配置文件名为:
myconfig-prod.yml
可使用如下命令启动:
java -jar app.jar --spring.config.name=myconfig --spring.profiles.active=prod
此时系统将尝试加载:
myconfig.yml
以及:
myconfig-prod.yml
这种方式较少使用,除非你希望摆脱默认的“application”命名规则。
--spring.config.name
问题1:为何存在两个不同的命令?
解析:--spring.config.name 仅负责更改配置文件的基础名称,不具备环境切换功能,因此通常需配合 --spring.profiles.active 使用。
这类似于分工协作:一个决定文件名,另一个决定使用哪套环境配置。
spring.config.name
spring.profiles.active
如果不设置name参数,Spring Boot将使用默认名称“application”,从而加载:
application.yml
application.properties
如果同时激活了prod环境:
--spring.profiles.active=prod
则系统会自动加载两个文件(注意是两个):
application.yml
application.properties
application-prod.yml
application-prod.properties
这种机制实际上回归到了标准的加载流程。
仅设置name参数会带来什么变化?
它会将基础名称由“application”替换为你指定的值。例如:
--spring.config.name=myconfig
那么Spring Boot将不再查找:
application.yml
application.properties
而是转而寻找:
myconfig.yml
myconfig.properties
并且不会加载诸如:
myconfig-prod.yml、myconfig-prod.properties
等以application开头的配置文件。
当name和active同时设置时:
Spring Boot将加载以下两个文件(同样为两个):
myconfig.yml
myconfig.properties
myconfig-prod.yml
myconfig-prod.properties
总结: --spring.config.name 并不会自动激活某个环境,它只是修改了配置文件的前缀名称,必须结合active参数才能完成环境切换。
问题2:为什么总是加载两个文件,而不是只加载我指定的那个?
解析:虽然加载了两个文件,但并不表示两个环境都被激活。这样设计的目的是为了提供基础配置作为兜底。
例如:
myconfig.yml 可选(基础配置)
myconfig-prod.yml 必须(激活配置)
这里并非同时激活两个环境,真正起作用的是带环境后缀的 -prod.yml 文件,而主配置文件仅作为通用配置的基础。
加载顺序如下:
- 首先加载
myconfig.yml,生成一份基础配置Map; - 然后加载
myconfig-prod.yml,将其键值对覆盖到基础Map上; - 最终保留的是经过覆盖后的单一配置集。
③ 使用 --spring.config.location 显式指定配置文件路径(不推荐),例如:
java -jar app.jar --spring.config.location=/opt/conf/application-prod.yml --spring.profiles.active=prod
含义:仅使用指定路径下的:
/opt/conf/application-prod.yml
而不再扫描默认路径中的配置文件。此方式容易破坏默认行为,大多数场景下不建议使用。
效果:直接激活:
/opt/conf/application-prod.yml
④ 使用 --spring.config.additional-location 添加额外的配置路径(不影响默认路径),例如:
java -jar app.jar --spring.config.additional-location=/opt/conf/ --spring.profiles.active=prod
含义:在保留默认搜索路径的基础上,额外从:
/opt/conf/
目录中加载配置。这是生产环境中最为推荐的做法,既灵活又安全。
效果:成功激活:
/opt/conf/application-prod.yml
3. 各方式的对比关系
| 参数 | 控制什么 | 是否改变文件位置 | 是否改变文件名 | 典型应用场景 |
|---|---|---|---|---|
| spring.profiles.active | 使用哪套配置(环境切换) | 否 | 否 | 多环境部署,如 dev / test / prod |
| spring.config.name | 配置文件的基础名称 | 否 | 是 | 自定义配置文件前缀名 |
| spring.config.location | 配置文件的存储路径 | 是(完全替换) | 间接影响 | 强制指定唯一配置源 |
| spring.config.additional-location | 追加配置路径 | 是(追加) | 间接影响 | 扩展配置源,适用于复杂部署 |
4. 总结
在运行JAR包进行部署时,Spring Boot提供了多种机制来加载和激活指定的配置文件。理解各参数的作用及优先级关系对于正确管理不同环境下的配置至关重要。
推荐做法是在生产环境中使用 --spring.config.additional-location 追加外部配置路径,结合 --spring.profiles.active 实现环境切换,既能保持灵活性,又能避免破坏默认加载逻辑。
而对于简单的环境隔离,仅使用 --spring.profiles.active 即可满足大部分需求,无需引入复杂的参数组合。
配置文件路径设置
自定义文件名
通过参数 spring.config.location 可以指定配置文件的读取位置。该参数用于替换默认的配置路径,其设定的位置将完全覆盖原有路径。
配置文件所在位置:
??(替换)
?
支持使用特殊路径进行配置,例如绝对路径、类路径或外部目录等。
附加配置路径
使用 spring.config.additional-location 可以在保留默认路径的基础上,额外添加新的配置文件搜索位置。该参数的作用是追加路径,而非替换。
文件搜索位置:
??(追加)
?
在生产环境中,这种机制常用于加载环境特定的配置,比如不同服务器间的差异化设置。
/app/
app.jar
config/
application-prod.yml
常用启动方式
大多数项目在部署时仅需使用一个核心命令:
--spring.profiles.active=xxx
其余参数通常只在配置文件未放置于默认路径时才需要显式指定。
典型项目结构示例
标准的启动命令结构一般如下所示:
java -jar app.jar --spring.profiles.active=prod
4. 总结
绝大多数应用场景下,只需通过主命令启动应用,并结合激活 profile 来控制环境配置。只有当配置文件位于非标准路径时,才需引入 spring.config.location 或 spring.config.additional-location 进行路径调整。


雷达卡


京公网安备 11010802022788号







