springboot多環境配置,告別繁雜的屬性配置

  在平時的開發中,經常會有多個環境,如何管理多個環境中的配置吶?一個是我們本地的開發環境,可以稱為dev,一個是測試環境,我們稱為test,最後還要有生產環境,稱為prod。每個環境的配置都是不一樣的,如何做到快捷方便的使用各自環境的配置絕對是開發中需要著重考慮的。

一、如何配置多環境

  在springboot中有默認的配置文件application.properties/application.yml文件,前面幾篇分享中一直都是以application.properties文件為例,繼續延用該習慣,且application.properties文件的優先順序高於application.yml文件。

  在resources目錄下新建application-dev.properties、application-test.properties、application-prod.properties三個配置文件,注意application.properties文件一定要存在,因為它是默認的配置文件。思考下如果沒有application.properties文件,有什麼方法可以實現不同環境的配置文件切換,答案是前邊說的「spring.config.name」和「spring.config.location」這兩個屬性,不同環境配置不同的文件名即可。繼續看三個配置文件,

application-dev.properties

server.port=9091

application-test.properties

server.port=9092

application-prod.properties

server.port=9093

另外,在application.properties的配置如下,新加了「spring.profiles.active=test」配置,

server.port=9090
spring.profiles.active=test

看下啟動效果,

可以看到這樣就可以實現多環境的動態切換,只需要修改application.properites文件中的「spring.profiles.active」的值即可,注意配置文件需滿足application-${profiles}.properties/yml的格式,${profiles}=dev/test/prod/dev3.....

二、生效多環境的多種方式

  上面,了解了如何配置多個環境的配置,下面看下如何動態使用。除了上面提到的「spring.profiles.active」還有很多意想不到的。

2.1、spring.config.name

  上面也提到可以使用"spring.config.name"屬性來決定使用哪個配置文件,「spring.config.name」可以配置在JVM參數和環境變數處,且JVM參數的優先順序大於環境變數的。下面嘗試下,直接配置在JVM參數處,演示下效果,

這裡配置「-Dspring.config.name=application-prod」也就是使用application-prod.properties文件,那麼這裡的埠肯定是「9093」,看下啟動日誌

在不同環境下的多個配置文件,可以使用「spring.config.name」屬性來指定使用哪個環境的文件。不過大多數情況下不建議使用該方式。

2.2、spring.profiles.active

  在上面也提到了該屬性「spring.profiles.active」注意該屬性和「spring.config.name」的配置值是有區別的,「spring.profiles.active」配置的是application-dev.properties中的「dev「,而「spring.config.name」則配置的是」application-dev「。」spring.profiles.active「不僅可以配置在application.properites文件中,還可以配置在JVM變數和環境變數中,下面看下在配置文件和JVM變數中的優先順序,

  在application.properties文件中配置」spring.profiles.active=test「,

在JVM變數中配置」spring.profiles.active=prod「,

看下啟動日誌,

從上圖,可以知道JVM變數的優先順序大於application.properties中的配置,也就是說JVM中的」spring.profiles.active「的值會覆蓋application.properties中的」spring.profiles.active「中的值。

我們上面說到的都是需要在啟動的時候配置參數,那麼有沒有一種方式可以把配置文件打包在jar包里,在啟動的時候不需要配置參數,直接執行jar即可。下面的這種方式或許可以實現哦。

2.3、pom中<profiles>標籤

  可以結合maven中的<profiles>標籤動態切換多環境的配置文件,由於這裡不再使用」spring.config.name「及」spring.profiles.active「等屬性,所以springboot默認讀取的配置文件依然是」application.properties「文件,既然多環境下都是該文件,那如何做區分吶,看下圖,

沒錯,通過不同的文件夾來區分不同的環境,每個文件夾下的配置文件的內容分別是dev(9091)、test(9092)、prod(9093),那麼要如何載入不同的文件,這裡要結合pom.xml文件,

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>springTemplate</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>
    </dependencies>
    <profiles>
        <!--dev環境-->
        <profile>
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!--test環境-->
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
        <!--prod環境-->
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>
    </profiles>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources/${profiles.active}</directory>
            </resource>
        </resources>
    </build>
</project>

在pom.xml文件中加入了上面的配置,idea的」maven「介面,發生了下面的變化,默認是上面配置的」dev「,

看下選擇了」dev「,服務的啟動日誌,

從服務啟動日誌可以看到在埠」9091「啟動,也就是使用的是test的配置文件。注意,修改了下圖中的值後,一定要先執行mvn clean,然後執行mvn compie,最後再啟動項目,

使用這樣的方式,在打包的時候就可以根據不同的環境選擇不同的profile,每個環境的包的配置文件是不一樣的。

三、總結

  本文主要分享了如何在springboot的項目中使用多環境配置,重點是」spring.profiles.active「屬性,

  1、使用」spring.profiles.actvie「屬性可以指定配置文件,要指定的文件需滿足application-${profiles}.properties/yml的格式,${profiles}可以是dev、test、prod等代表不同環境的值;

  2、不同環境配置不同文件,可使用"spring.profiles.active"和」spring.config.name「屬性,針對」spring.profiles.active「可以配置在application.properties也可以配置在JVM中,JVM參數的優先順序大於application.properties文件。其實,springboot項目中application.properties文件中可配置的屬性都可以通過JVM/環境變數的方式配置;

  3、多環境打包,可以使用pom中的<profiles>標籤,不同環境打包各自的配置文件;

 

推薦閱讀

做了這些年開發,今天第一次梳理了這三種常用的變數

springboot如何使用自定義配置文件

springboot竟然有5種默認的載入路徑,你未必都知道

5分鐘快速搭建一個springboot的項目