部署jar包时指定配置文件

文章目录

      • 部署时指定配置文件
        • [1. Spring Boot的配置文件来源](#1. Spring Boot的配置文件来源)
        • [2. 常见加载配置文件的方式](#2. 常见加载配置文件的方式)
        • [3. 各方式的对比关系](#3. 各方式的对比关系)
        • [4. 总结](#4. 总结)

本文主要介绍运行 jar 包部署时,怎么加载并激活 指定的配置文件

部署时指定配置文件

1. Spring Boot的配置文件来源

1、Spring Boot配置文件来源可能是:

  • resources目录
  • 命令行:--xxx
  • 环境变量:SPRING_XXX
  • 配置中心(可选)

启动时,Spring Boot 会把各种来源合并成一套配置。

2、Spring 会自动找配置文件,默认搜索路径 且 优先级从高到低 为:

yaml 复制代码
./config/ (JAR 同级 config 目录)
./ (JAR 同级目录)
classpath:/config/ (资源目录 config)
classpath:/ (资源目录)

也就是说:如果你的外部配置叫 application.yml,并放在 jar同级 或 同级config目录,不用写任何参数,会自动生效。

激活时:你只要把文件放到:jar同级 或 同级目录/config/application-xxx.yml,就会自动加载,不需要额外指定路径。想激活时直接用 --spring.profiles.active=xxx 激活即可。

但如果配置文件不在默认位置,需要告诉 Spring 去哪找配置文件?用这两个参数:

  • spring.config.location(替换默认位置)
  • spring.config.additional-location(追加位置,不替换)
2. 常见加载配置文件的方式

使用方式:

① --spring.profiles.active:决定使用哪套配置(环境切换),如:

bash 复制代码
java -jar app.jar --spring.profiles.active=prod

效果:使用 application-prod.yml

② --spring.config.name (不推荐):决定配置文件名字,默认是 application。比如:你的配置文件叫 myconfig-prod.yml,命令:

bash 复制代码
java -jar app.jar --spring.config.name=myconfig --spring.profiles.active=prod

效果:查找 myconfig.yml, myconfig-prod.yml。很少用,除非你不想用 application 这个名字。

问题1:为什么有 2 个命令?

解析:spring.config.name 只负责"配置文件的名字",不负责区分环境,所以它通常要配合 spring.profiles.active 一起用。就像:一个负责文件叫什么、一个负责用哪套环境配置。

  1. 不加 name 时怎么工作?

    Spring Boot 默认配置名是:application,所以它会加载:

    bash 复制代码
    application.yml
    application.properties

    如果你激活了 prod:

    复制代码
    --spring.profiles.active=prod

    Spring 会自动加载:(注意是 2 个文件,为什么是 2 个文件,后面会讲)

    复制代码
    application.yml
    application.properties
    
    application-prod.yml
    application-prod.properties

    这又回到了普通方式。

  2. 只加 name 改变了什么?

    它会把 "application" 换成你指定的名字。比如:--spring.config.name=myconfig。那么 Spring 不再去找:

    复制代码
    application.yml
    application.properties

    而是去找:

    复制代码
    myconfig.yml
    myconfig.properties

    不会加载 myconfig-prod.yml、myconfig-prod.properties等

  3. 都加:

    Spring 会加载:(同理:也是2个文件)

    复制代码
    myconfig.yml
    myconfig.properties
    
    myconfig-prod.yml
    myconfig-prod.properties

总结:spring.config.name 不会自动控制环境,它只是改名字,没有激活具体环境。

问题2:为什么是加载 2 个文件,按理说,不是只加载我激活的那个配置?

解析:只是加载 2 个文件,并不是说生效 2 个环境。其实这么做是为了兜底:

复制代码
myconfig.yml   可选(基础配置)
myconfig-prod.yml   必须(激活配置)

不是激活两个,真正起作用的是 -prod 文件,基础配置只是兜底。(当然你有这些配置才加载,你都没有我肯定不加载)

加载顺序是:先加载 myconfig.yml 得到一份基础配置 Map;再加载 myconfig-prod.yml 把 key-value 覆盖前面的 Map。最终结果:只保留覆盖后的 Map(一次配置)

③ --spring.config.location (不推荐):指定配置文件的位置(会覆盖默认路径),如:

bash 复制代码
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:追加配置路径(不会覆盖默认路径)。如:

bash 复制代码
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 使用哪套配置 ❌ ❌ 环境切换
spring.config.name 使用什么名字 ❌ ✔️ 自定义文件名
spring.config.location 文件在哪里 ✔️(替换) ❌ 特殊路径
spring.config.additional-location 文件在哪里 ✔️(追加) ❌ 生产常用
4. 总结

绝大部分项目只用一个命令:--spring.profiles.active=xxx ,其它参数只有当配置文件不在默认路径时才会用。

一般结构如下:

复制代码
/app/
  app.jar
  config/
    application-prod.yml
java 复制代码
java -jar app.jar --spring.profiles.active=prod
相关推荐
weixin_460443568 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
kobe_OKOK_10 小时前
__getattr__和__getattribute__如何用
python
海鸥-w11 小时前
什么是AOP
java
全栈弄潮儿11 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技11 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y11 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川11 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸11 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck11 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870511 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器