部署jar包时指定配置文件

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

部署时指定配置文件

1. Spring Boot的配置文件来源

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

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

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

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

./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:决定使用哪套配置(环境切换),如:

java -jar app.jar --spring.profiles.active=prod

效果:使用 application-prod.yml

--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 这个名字。

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

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

  1. 不加 name 时怎么工作?

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

    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(不推荐):指定配置文件的位置(会覆盖默认路径),如:

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

4. 总结

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

一般结构如下:

/app/
  app.jar
  config/
    application-prod.yml
java -jar app.jar --spring.profiles.active=prod
在 Docker 中部署 Java JAR 文件并指定外部配置文件,通常需要通过编写一个 Dockerfile 来定义容器的构建过程,并在运行容器挂载配置文件或将其复制到镜像中。以下是几种常见的方式,适用于不同的部署需求。 ### 使用 `COPY` 指令将配置文件复制到镜像中 可以在构建镜像配置文件直接复制到容器内部,这种方式适合配置文件固定不变的情况。例如: ```dockerfile FROM java:8 COPY myapp.jar /app.jar COPY application.properties /application.properties ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=/application.properties"] ``` 此方法确保配置文件JAR 一同打进镜像中,并在容器启动指定配置文件路径[^4]。 --- ### 使用 `-v` 参数挂载外部配置文件 如果希望在容器运行动态指定配置文件,可以使用 Docker 的 `-v` 参数将宿主机上的配置文件挂载到容器中。例如: ```bash docker run -d \ -v /host/config:/container/config \ -p 8080:8080 \ java:8 \ java -jar /app.jar --spring.config.location=/container/config/application.properties ``` 此方式允许在不重新构建镜像的情况下修改配置文件,适用于开发和测试环境[^2]。 --- ### 在 Dockerfile 中使用 `VOLUME` 指定挂载点 如果希望容器内创建一个目录用于后续挂载,可以在 Dockerfile 中使用 `VOLUME` 指令。例如: ```dockerfile FROM openjdk:8-jre MAINTAINER abc VOLUME /home/test WORKDIR /home/test ADD test-1.0-SNAPSHOT.jar test.jar CMD mkdir /home/test/config ENTRYPOINT ["java", "-jar", "test.jar"] ``` 运行容器,使用 `-v` 参数将宿主机的配置目录挂载到 `/home/test/config` 路径下,从而实现配置文件的外部化[^2]。 --- ### 结合环境变量动态指定配置文件路径 还可以通过环境变量来动态指定配置文件路径,提高灵活性。例如: ```dockerfile FROM java:8 COPY myapp.jar /app.jar ENTRYPOINT ["sh", "-c", "java -jar /app.jar --spring.config.location=$CONFIG_PATH"] ``` 运行容器设置环境变量: ```bash docker run -d -e CONFIG_PATH=/path/to/config.properties -v /host/config:/path/to java:8 ``` 此方法适合在不同环境中切换配置,而无需修改 Dockerfile 或命令行参数[^4]。 --- ### 总结 根据实际需求,可以选择以下方式之一: - **固定配置**:使用 `COPY` 将配置文件进镜像。 - **动态配置**:使用 `-v` 挂载宿主机文件或目录。 - **环境变量控制**:通过环境变量指定配置文件路径,提升灵活性。 这些方法均能有效实现 Docker 中 Java 应用的配置文件管理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学鸡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值