部署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
相关推荐
niucloud-admin21 小时前
java服务端——controller控制器
java·开发语言
To Be Clean Coder21 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
Fortunate Chen21 小时前
类与对象(下)
java·javascript·jvm
程序员水自流21 小时前
【AI大模型第9集】Function Calling,让AI大模型连接外部世界
java·人工智能·llm
‿hhh21 小时前
综合交通运行协调与应急指挥平台项目说明
java·ajax·npm·json·需求分析·个人开发·规格说明书
小徐Chao努力21 小时前
【Langchain4j-Java AI开发】06-工具与函数调用
java·人工智能·python
无心水21 小时前
【神经风格迁移:全链路压测】33、全链路监控与性能优化最佳实践:Java+Python+AI系统稳定性保障的终极武器
java·python·性能优化
萧曵 丶21 小时前
Synchronized 详解及 JDK 版本优化
java·多线程·synchronized
夏幻灵21 小时前
JAVA基础:基本数据类型和引用数据类型
java·开发语言
luoluoal21 小时前
基于python的小区监控图像拼接系统(源码+文档)
python·mysql·django·毕业设计·源码