[SpringBoot]配置文件②(多环境配置,配置文件分类)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 多环境配置,配置文件分类

@[TOC]

多环境配置

以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 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_fileSpringBoot 工程,目录结构如下

在这里插入图片描述

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 下的配置文件优先于类路径下的配置文件。==

==注意:==

SpringBoot 2.5.0版本存在一个bug,我们在使用这个版本时,需要在 jar 所在位置的 config 目录下创建一个任意名称的文件夹

相关文章
|
4月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
918 0
|
4天前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
11 2
|
16天前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
43 3
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
46 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
2月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
|
3月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
44 0
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的分类信息服务平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的分类信息服务平台的详细设计和实现(源码+lw+部署文档+讲解等)
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的分类信息服务平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的分类信息服务平台附带文章源码部署视频讲解等
27 0
|
Java 应用服务中间件 Maven
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
489 0
传统maven项目和现在spring boot项目的区别
|
XML Java 数据库连接
创建springboot项目的基本流程——以宠物类别为例
创建springboot项目的基本流程——以宠物类别为例
153 0
创建springboot项目的基本流程——以宠物类别为例