网站首页 > 精选教程 正文
多环境配置
以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配置,将环境的配置改为线上环境的。
来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明
使用 yaml 文件配置
在 application.yml 中使用 --- 来分割不同的配置,内容如下
#开发
spring:
profiles: dev #给开发环境起的名字
server:
port: 80
---
#生产
spring:
profiles: pro #给生产环境起的名字
server:
port: 81
---
#测试
spring:
profiles: test #给测试环境起的名字
server:
port: 82
---
上面配置中 spring.profiles 是用来给不同的配置起名字的。而如何告知 SpringBoot 使用哪段配置呢?可以使用如下配置来启用都一段配置
#设置启用的环境
spring:
profiles:
active: dev #表示使用的是开发环境的配置
综上所述,application.yml 配置文件内容如下
#设置启用的环境
spring:
profiles:
active: dev
---
#开发
spring:
profiles: dev
server:
port: 80
---
#生产
spring:
profiles: pro
server:
port: 81
---
#测试
spring:
profiles: test
server:
port: 82
---
==注意:==
在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。最新用来起名字的配置项是
#开发
spring:
config:
activate:
on-profile: dev
使用 properties 文件配置
properties 类型的配置文件配置多环境需要定义不同的配置文件
- application-dev.properties 是开发环境的配置文件。我们在该文件中配置端口号为 80
server.port=80
- application-test.properties 是测试环境的配置文件。我们在该文件中配置端口号为 81
server.port=81
- application-pro.properties 是生产环境的配置文件。我们在该文件中配置端口号为 82
server.port=82
SpringBoot 只会默认加载名为 application.properties 的配置文件,所以需要在 application.properties 配置文件中设置启用哪个配置文件,配置如下:
spring.profiles.active=pro
命令行启动参数设置
使用 SpringBoot 开发的程序以后都是打成 jar 包,通过 java -jar xxx.jar 的方式启动服务的。那么就存在一个问题,如何切换环境呢?因为配置文件打到的 jar 包中了。
我们知道 jar 包其实就是一个压缩包,可以解压缩,然后修改配置,最后再打成 jar 包就可以了。这种方式显然有点麻烦,而 SpringBoot 提供了在运行 jar 时设置开启指定的环境的方式,如下
java –jar xxx.jar –-spring.profiles.active=test
那么这种方式能不能临时修改端口号呢?也是可以的,可以通过如下方式
java –jar xxx.jar –-server.port=88
当然也可以同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口,如下
java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test
大家进行测试后就会发现命令行设置的端口号优先级高(也就是使用的是命令行设置的端口号),配置的优先级其实 SpringBoot 官网已经进行了说明,参见 :
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
进入上面网站后会看到如下页面
如果使用了多种方式配合同一个配置项,优先级高的生效。
这里有几个注意点:①在给项目打包之前先使用 clean 命令,特别是在上一次的结果影响本次的操作时。clean 的本质就是:该命令会删除项目路径下的 target 文件,但是不会删除本地的 maven 仓库已经生成的 jar 文件
②我们的配置文件中偶尔有可能写中文(==注意我说的是配置文件==),这样可能造成打包失败,我们要在 filecoding 中,将设置改成如下图所示:
多环境开发的兼容问题(Maven 与 SpringBoot)
我们前面在 Maven 中也提到过多环境开发,既然这样如果 maven 中配置有多环境开发,springboot 中也配置有多环境开发,那他们两个谁做主呢?
就比如说你 maven 中配置的是以开发环境为主,springboot 中配置的是以测试环境为主,那么我们启动项目的时候,究竟启动的是哪一个环境?
我们可以思考一个问题,最终我们的 springboot 工程是在服务器上启动,再说的直白点,我们最终启动是那个打好了的 jar 包。而这个 jar 是 maven 帮我们做的(执行 package 命令之后得到),所以我们可以知道 maven 里面的 profile 应该是启主导作用的,而我们 boot 里面的多环境开发仅仅相当于 maven 打包过程中的工具。
所以:maven 为主,boot 为辅
接下来我们尝试用 maven 控制版本,用 boot 加载 maven 中设置的版本。
步骤一:Maven 中设置多环境属性
步骤二:SpringBoot 中引用 Maven 属性
当我们最终启动的时候效果如下:
如果就这样子去打包还是不会成功的,因为你此处的占位符不会被解析,我们要扩大解析的范围,所以说:
步骤三:对资源文件开启默认占位符的解析
如此才能完成解析:
配置文件分类
有这样的场景,我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置,如下
java –jar springboot.jar –-spring.profiles.active=test --server.port=85 --server.servlet.context-path=/heima --server.tomcat.connection-timeout=-1 …… …… …… …… ……
针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。
SpringBoot 中 4 级配置文件放置位置:
- 1 级:classpath:application.yml
- 2 级:classpath:config/application.yml
- 3 级:file :application.yml
- 4 级:file :config/application.yml
==说明==:级别越高优先级越高
1 级与 2 级留做系统打包后设置通用属性 3 级与 4 级用于系统开发阶段设置通用属性
我们演示一下他们的优先级:
环境准备
创建一个名为 springboot_06_config_file 的 SpringBoot 工程,目录结构如下
在 resources 下创建一个名为 config 的目录,在该目录中创建 application.yml 配置文件,而在该配置文件中将端口号设置为 81,内容如下
server:
port: 81
而在 resources 下创建的 application.yml 配置文件中并将端口号设置为 80,内容如下
server:
port: 80
验证 1 级和 2 级的优先级
运行启动引导类,可以在控制台看到如下日志信息
通过这个结果可以得出==类路径下的 config 下的配置文件优先于类路径下的配置文件。==
验证 3 级和 4 级的优先级
要验证 4 级,按照以下步骤完成
- 将工程打成 jar 包
- 点击工程的 package 来打 jar 包
- 在硬盘上找到 jar 包所在位置
- 在 jar 包所在位置创建 config 文件夹,在该文件夹下创建 application.yml 配置文件,而在该配合文件中将端口号设置为 82
- 在命令行使用以下命令运行程序
java -jar springboot_06_config_file-0.0.1-SNAPSHOT.jar
运行后日志信息如下
通过这个结果可以得出 file: config 下的配置文件优先于类路径下的配置文件。
原文链接;https://xie.infoq.cn/article/0de6c2c41d08f069be1076801
- 上一篇: 深入剖析Java Enum类型
- 下一篇: Java Class 类文件格式看这一篇就够了
猜你喜欢
- 2025-01-07 Java语言的数据类型详解
- 2025-01-07 Java接口&异常处理&类型转换
- 2025-01-07 Java中类定义的总结
- 2025-01-07 Java 计算文件Checksum方式
- 2025-01-07 Java常见类型数据及其包装类-byte类型,String类型,boolean类型
- 2025-01-07 Batch批处理学习教程
- 2025-01-07 java程序员一定要学会的骚操作“Redis的五大数据类型实现原理”
- 2025-01-07 mybatis框架:配置文件中的标签详解
- 2025-01-07 JAVA学习基础之数据类型
- 2025-01-07 一文读懂Java的Class文件结构
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)