多环境配置 - SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 06 -多环境配置
在一个项目的开发过程中,通常伴随着多套环境:本地环境 local、开发环境 dev、集成测试环境 test、用户接受测试环境 uat、预生产环境 pre、生产环境 prod。本节的内容有些脱离真实企业开发,因为在真实的企业开发中,不会只开发一个独立的服务,而是多个微服务。发展至今,云原生也越来越普遍。面对多套环境,通常是”一套代码 + 配置中心“的方式,将代码编译打包后,在启动服务时或服务运行过程中,从配置中心读取配置,保证各个环境代码完全一致,仅配置不同。关于配置中心,在后面的系列文章中会详细介绍。
1 配置文件
1.1 配置文件优先级
在第一篇文章中就谈到,Spring Boot 默认核心配置文件名为 application
,支持 application.properties
、application.yml
、application.yaml
。后面两个本质上同一种类型。当三者同时存在时,优先级为:properties
> yaml
> yml
。也就是说,当某个配置项在几者中都存在时,该配置项的值就使用 application.properties
中的值。
此外,配置文件的优先级与目录有关。通常情况下,我们都把核心配置文件放在 src/main/resources
下,本质上是在类路径下(编译后 src/main/resources 下的文件会编译到 target/classes/下面)。如果放到 config
目录下(如: src/main/resources/config/application.yml),config
目录下的核心配置文件优先级会更高。
官方文档中还提到核心配置文件放在项目根路径等情景,在项目中到目前为止都没碰到过,这里就不提了。
最后说明一点,优先级最最高的,是在启动命令行后面的参数。如 server.port,无论在配置文件中配置什么,只要在启动命令后面配置了该参数,就使用该参数的值:
java -jar hero-springboot-demo.jar --server.port=9099
1.2 bootstrap.yml
也许在很多代码里会看到 bootstrap.yml
文件,有些文章说 bootstrap.yml
的优先级最高。这种说法是不完全准确的!
bootstrap.yml
文件在纯粹的 Spring Boot 应用中不会生效,它只有在 Spring Cloud 下才会生效,在 Spring Cloud 中,应用会直接或间接依赖 spring-cloud-context
,此时才会读取 bootstrap.yml
文件和 application.yml
文件,这种情况下 bootstrap.yml
优先级高于其他核心配置文件。
1.3 准备配置文件
为多个环境准备不同的配置文件,这里模拟三个环境:本地环境 local、开发环境 dev、测试环境 test。在 src/main/resources 目录下复制 application.yml 到当前目录,分别重命名为 application-local.yml
、application-dev.yml
、application-test.yml
。端口号 server.port
分别修改为 9099、9091、9092。
src/main/resources/
|- application.yml
|- application-local.yml 9099
|- application-dev.yml 9091
|- application-test.yml 9092
|- ....
上面复制的三个文件命名方式都是:application-{环境名称}
,按照这种方式命名,就不需要分别在每个环境的配置文件中使用 spring.profiles
来设置名字了。application.yml
为主文件。
2 多环境两种配置方式
2.1 spring.profiles.active
这种方式可以通过设置 spring.profiles.active 的值来指定使用的环境配置文件。修改 application.yml
,删除里面的全部内容,添加 profile 配置,如下:
spring:
profiles:
active: local
上面的配置指定了环境为 local
,会加载 application-local.yml
文件。
同样的,可以将 local
修改为dev
、test
,分别对应 application-dev.yml
、application-test.yml
。
此外,在打包后,也可以在运行 jar 包时指定生效的环境:
java -jar hero-springboot-demo.jar --spring.profiles.active=test
由于启动参数中指定了 test,无论 application.yml 中配置什么,都会被命令行参数 test 覆盖,读取 application-test.yml 的配置。
2.2 Maven
除了上面手动修改 spring.profiles.active 的方式,还可以通过 Maven打包实现。
application.yml
中 spring.profiles.active
配置一个占位符,在 Maven 打包时,通过具体的 profile,替换 application.yml 中的占位符。具体实现如下:
1)application.yml 中使用占位符
spring:
profiles:
active: @env@
2)pom.xml 中配置多环境
首先配置 profile:
<profiles>
<profile>
<id>local</id>
<properties>
<env>local</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
上面配置了三套 profile,env的值分别定义为 local、dev、test,且 local 为默认激活。 接着在 <build>
中添加资源的处理:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-*.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${env}*.yml</include>
</includes>
</resource>
</resources>
<plugins>
...
</plugins>
</build>
filtering
设置为 true,表示利用占位符进行替换。上面的配置先排除 application-
开头的资源文件,然后在根据生效的profile 对应的 env
的值,打包对应的 application-xxx.yml 文件。
现在启动服务,正常加载使用 application-local.yml
,端口号为 9099。
接下来测试打包。打包有两种方式:使用命令行和IDEA。
命令行:
mvn clean package -Pdev
-P后面就是对应的环境。
使用图形界面,需要先选择profile,如下图所示:
两种方式打包后都会在 target 目录下生成 hero-springboot-demo.jar
,可以在命令行中启动,查看加载的环境配置文件和运行的端口号:
java -jar target/hero-springboot-demo-1.0-SNAPSHOT.jar
今日程序员优雅哥(\/ youyacoder)学习到此结束~~~
多环境配置 - SpringBoot 2.7.2 实战基础的更多相关文章
- 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...
- 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础
优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...
- 集成 Redis & 异步任务 - SpringBoot 2.7 .2实战基础
SpringBoot 2.7 .2实战基础 - 09 - 集成 Redis & 异步任务 1 集成Redis <docker 安装 MySQL 和 Redis>一文已介绍如何在 D ...
- SpringBoot 如何集成 MyBatisPlus - SpringBoot 2.7.2实战基础
SpringBoot 2.7.2 学习系列,本节通过实战内容讲解如何集成 MyBatisPlus 本文在前文的基础上集成 MyBatisPlus,并创建数据库表,实现一个实体简单的 CRUD 接口. ...
- SpringBoot | 第五章:多环境配置
前言 写上一篇看英文资料,耗费了心力呀,这章,相对来说简单点.也比较熟悉,但是这很实用.不扯了,开始~ 多环境配置 maven的多环境配置 springboot多环境配置 总结 老生常谈 多环境配置 ...
- SpringBoot学习<二>——SpringBoot的默认配置文件application和多环境配置
一.SpringBoot的默认文件appliction 上一篇文章已经说明,springboot启动会内嵌tomcat,端口也是默认的8080,如果我们想要改变端口如果做呢? 在springboot项 ...
- Java应用在docker环境配置容器健康检查
在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- GPU编程自学2 —— CUDA环境配置
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
随机推荐
- 【SpringSecurity系列3】基于Spring Webflux集成SpringSecurity实现前后端分离无状态Rest API的权限控制
源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/02-springsecurity-state ...
- 155_模型_Power BI & Power Pivot 进销存之安全库存
155_模型_Power BI & Power Pivot 进销存之安全库存 一.背景 谈进销存的概念时,我们也需要提及另外一个概念:安全库存. 库存周转在理想的状态下是做到零库存,但是在内部 ...
- Nginx下fastcgi_split_path_info导致CodeIgniter配置问题
Nginx下fastcgi_split_path_info导致CodeIgniter配置问题 突然发最近又有点懒散了,很久没有写东西了!今天谈点关于不是什么很新的问题,在nginx下配置ci框架时 ...
- 解决Invalid bound statement (not found)的异常
今天在搭建框架的时候,报了一个Invalid bound statement (not found)的异常 经过分析,得出原因: 我的mybatis相关的dao和mapper.xml是通过逆向工程生成 ...
- IE让我首次遭受了社会的毒打
2022年6月15日,微软终止对IE的支持,自此IE走入历史,可以说这是一个时代的终结. 自己在 2011 年刚从业时,IE 在国内的市场占有率可是遥遥领先的,下图来自于 StatCounter 网站 ...
- React技巧之字符串插值
原文链接:https://bobbyhadz.com/blog/react-string-interpolation 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中,使 ...
- cmd命令与bat编程
命令解压缩文件 winrar 命令行解压文件 winrar x 要解压的文件 要解压到的路径 (保存压缩文件内的目录结果) 直接覆盖 -o+ 覆盖已存在文件 在不提示 ...
- Bitbucket 使用 SSH 拉取仓库失败的问题
问题 在 Bitbucket 使用 Linux 机器上 ssh-keygen 工具生成的公钥作为 API KEY,然后在 Jenkins 里面存储对应的 SSH 私钥,最后执行 Job 的时候,Win ...
- python小题目练习(八)
题目:电视剧的收视率排行榜 需求:实现如下图所示需求 代码展示: """Author:mllContent:电视剧的收视率排行榜Date:2020-11-16" ...
- 论文阅读 GloDyNE Global Topology Preserving Dynamic Network Embedding
11 GloDyNE Global Topology Preserving Dynamic Network Embedding link:http://arxiv.org/abs/2008.01935 ...