Java Spring Boot 修改yml配置&加载顺序规则

Spring Boot 的配置加载顺序规则

Spring Boot 有非常明确的配置加载顺序和优先级规则:

1. 格式优先级高于Profile

对于相同名称的配置文件文件格式的优先级是固定的,与加载顺序无关:

.properties > .yml > .yaml

也就是说,如果同时存在 application-vipsoft.propertiesapplication-vipsoft.yml

  • application-vipsoft.properties 中的配置会覆盖 application-vipsoft.yml 中的相同配置
  • 这是由Spring Boot的设计决定的,properties文件的优先级永远高于yml/yaml文件

2. 配置加载顺序

Spring Boot 按以下顺序加载配置(后面的覆盖前面的):

  1. Jar包内的 application.yml (或application.properties)
  2. Jar包内的 application-{profile}.yml
  3. Jar包外(同一目录)的 application.yml
  4. Jar包外(同一目录)的 application-{profile}.yml
  5. Jar包外(同一目录)的 application.properties
  6. Jar包外(同一目录)的 application-{profile}.properties
  7. 当前目录下的 /config 子目录最高优先级 【推荐】
  8. 命令行参数
  9. 环境变量

如果有以下两个文件:

arduino 复制代码
D:\your-app\
│   application-vipsoft.yml        ← 优先级:第二
│   his-web-1.0.0.jar
│
└───config/
        application-vipsoft.yml    ← 优先级:第一(最高)
  • 将主要配置放在config目录下,这是最标准的位置
  • 外层可以放一些最基础的默认配置或示例配置
  • 利用这种覆盖特性可以实现灵活的配置管理

所以,如果您想要最高优先级的配置,请放在config目录下!

配置方案

有时候运行好多年的系统,突然要改个配置。新的程序可能会产生BUG,那如何更新已有 yml 的值,有如下操作

参数形式

适合改动较少的情况

vbscript 复制代码
echo on
REM 后续命令使用的是:UTF-8编码
echo chcp 65001

title HIS API DEV 8090

"%JAVA_HOME%\bin\java" -Dloader.path=D:\Software\JavaLib -Dfile.encoding=UTF-8 -jar his-web-1.0.0.jar --server.port=8090 --spring.profiles.active=vipsoft

pause

使用配置文件(推荐,最清晰、最易维护)

这是Spring Boot应用的首选方式。将那些不常改变的参数(尤其是数据库连接、API地址等)移动到配置文件中。

  1. 创建/修改 application-vipsoft.yml 文件
    由于您已经指定了 --spring.profiles.active=vipsoft,Spring Boot会自动加载 application-vipsoft.yml。将这个文件放在与您的jar包同一目录下
yaml 复制代码
server:
  port: 22588

his:
  api-url: http://192.168.0.1/webservice/service.asmx?wsdl

spring:
  datasource:
    his:
      url: http://192.168.0.1/webservice/service.asmx?wsdl
      username: username
      password: pwd
  1. 简化后的启动命令
    现在,启动命令变得非常干净,只需要关注核心的JVM参数和配置文件激活。
vbscript 复制代码
echo on
REM 后续命令使用的是:UTF-8编码
echo chcp 65001

title HIS API DEV 8090

"%JAVA_HOME%\bin\java" -Dloader.path=D:\Software\JavaLib -Dfile.encoding=UTF-8 -jar his-web-1.0.0.jar --server.port=8090 --spring.profiles.active=vipsoft

pause

优点:

  • 命令极其简洁,不易出错。
  • 配置与代码分离,安全性更高(尤其是密码)。
  • 修改配置无需重新打包jar文件。
  • 不同环境(如测试、生产)可以轻松使用不同的配置文件。

使用Shell脚本或Batch文件(Windows批处理)

对于Windows,创建一个 startup.bat 文件。

bash 复制代码
@echo off
title HIS API DEV 8090

set JAVA_OPTS=-Dloader.path=D:\Software\JavaLib -Dfile.encoding=UTF-8
set SPRING_OPTS=--spring.profiles.active=vipsoft --server.port=8090
set HIS_OPTS=--his.api-url= https://www.hefeilaws.com/
set DS_OPTS=--spring.datasource.his.url="jdbc:sqlserver://192.168.0.2:1433;DatabaseName=XXX" --spring.datasource.his.username=username --spring.datasource.his.password=pwd

echo Starting application...
"%JAVA_HOME%\bin\java" %JAVA_OPTS% -jar his-web-1.0.0.jar %SPRING_OPTS% %HIS_OPTS% %DS_OPTS%

pause

优点:

  • 逻辑清晰,参数被分类设置。
  • 一键启动,避免了每次输入长命令。
  • 易于维护和修改参数。

使用环境变量

Spring Boot可以从环境变量中读取配置,这是一种非常云原生的做法。

  1. 设置环境变量(可以在批处理文件中设置,也可以在系统高级设置中设置)
ini 复制代码
set SPRING_DATASOURCE_HIS_URL=jdbc:sqlserver://192.168.0.2:1433;DatabaseName=XXX
set SPRING_DATASOURCE_HIS_USERNAME=username
set SPRING_DATASOURCE_HIS_PASSWORD=pwd
set HIS_API_URL= https://www.hefeilaws.com/

注意:Spring Boot将大写环境变量中的 _ 视为配置中的 .,例如 SPRING_DATASOURCE_HIS_URL 对应 spring.datasource.his.url。

  1. 启动命令
vbscript 复制代码
echo on
REM 后续命令使用的是:UTF-8编码
echo chcp 65001

title HIS API DEV 8090

"%JAVA_HOME%\bin\java" -Dloader.path=D:\Software\JavaLib -Dfile.encoding=UTF-8 -jar his-web-1.0.0.jar --server.port=8090 --spring.profiles.active=vipsoft

pause

优点:

  • 安全性高,敏感信息(如密码)不出现在命令行或配置文件中。
  • 配置非常灵活,特别适合Docker、Kubernetes等容器化部署。

最佳实践建议

  1. 检查jar包内 :先用解压软件查看jar包内是否已有 application-vipsoft.yml
  2. 保持一致:外部配置文件格式尽量与内部保持一致
  3. 外部配置优先:将需要修改的配置放在jar包外部的配置文件中,这样升级jar包时配置不会丢失
  4. 敏感信息处理:密码等敏感信息最好不要写在配置文件中,而是通过环境变量或命令行参数传入

最终建议 :检查jar包内的配置格式,然后在外部使用相同格式的配置文件,这样最清晰易懂。

相关推荐
狂奔小菜鸡4 天前
Day8 | Java 方法全解析
java·后端·java ee
考虑考虑13 天前
流收集器
java·后端·java ee
考虑考虑20 天前
JDK25中的StableValue
java·后端·java ee
考虑考虑24 天前
JDK25中的StructuredTaskScope
java·后端·java ee
考虑考虑25 天前
ScopedValue在JDK24以及JDK25的改动
java·后端·java ee
考虑考虑1 个月前
fastjson调用is方法开头注意
java·后端·java ee
kfepiza1 个月前
Java的任务调度框架之Quartz 笔记250930
java·java ee
考虑考虑1 个月前
时间转换格式出现错误
java·后端·java ee
考虑考虑2 个月前
图片翻转
java·后端·java ee
BillKu2 个月前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee