Spring

【Springboot】test、dev、stage、prod多环境配置

本文适用版本:Spring Boot v2.5.4

本文使用配置文件类型:YAML,非properties,这种文件用缩进代表层级关系,需要特别注意的是冒号“:”必须是英文类型的,且后面有个空格,如:

server:
    port: 8080
myenv:
    name: 开发环境

如果写成中文冒号,或者冒号后面没有空格,可能会有怪异结果出现,大家务必小心检查。

下面正文开始

需求:

由application.yml指定环境是dev、test或是stage、prod,环境细节在三个不同文件里书写。

实现步骤:

1.准备application.yml

在src/main/resource目录下删除原有文件application.properties(如果有的话),新建文本文件application.yml,内容如下:

#application.yml
spring:
    profiles:
        active: dev

第一行为注释可以忽略,下面三行的意思是让SpringBoot去找application-dev.yml文件(也在src/main/resource目录下),如果将dev修改成prod,那么会让SpringBoot去找application-prod.yml文件,其它test、stage据此类推。

2.准备application-dev.yml、application-prod.yml、application-test.yml三个文件,三个文件内容如下:

application-dev.yml

server:
    port: 8080
myenv:
    name: 开发环境

application-prod.yml

server:
    port: 8088
myenv: 
    name: 生产环境

application-test.yml

server: 
    port: 8085
myenv: 
    name: 测试环境

如果还有更多的环境,如application-stage.yml,拷贝一份改名修改即可。

3.如果上两步都正确,那多环境设置实际就成功了,启动启动类,在控制台可以看到是那种环境启动了,及指定的端口信息:

2021-09-21。。。。 com.hy.myapp.MyApplication               : The following profiles are active: dev
2021-09-21。。。。 o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

从上面可以看出当前是开发环境,服务端口是8080。

我们还可以运行测试类来确定当前环境:


import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
class MyApplicationTests {
    @Value("${server.port}")
    private String serverPort;
    
    @Value("${myenv.name}")
    private String myenvName;
    
    @Test
    void contextLoads() {
    }

    @Test
    void testEnvironment() {
        System.out.println("myenvName="+myenvName);
        System.out.println("serverPort="+serverPort);
    }
}

上面这个类通过Value注解的方式将端口赋予了serverPort成员,环境名称赋予了myenvName成员,我们跑以下junit就知道当前环境了。

2021-09-21 14:55:42.154  INFO 2300 --- [           main] com.hy.myapp.MyApplicationTests          : Started MyApplicationTests in 3.154 seconds (JVM running for 5.168)
myenvName=开发环境
serverPort=8080