Springboot與Maven多環境配置文件夾解決方案

Profile用法

我們在application.yml中為jdbc.name賦予一個值,這個值為一個變量

jdbc:    username: ${jdbc.username}

Maven中的profiles可以設置多個環境,當我們選擇a環境後,<jdbc.username>內的值將替換上述配置文件中的變量

    </profiles>          <profile>              <id>a</id>              <properties>                  <jdbc.username>root</jdbc.username>              </properties>              <!-- 默認使用此環境 -->              <activation>                  <activeByDefault>true</activeByDefault>              </activation>          </profile>      </profiles>

我們查看編譯後的application.yml文件,果然變量已經被賦值。我們猜想是否可以利用Profile的這一特性設置開發、測試、生產環境,選擇不同環境時使用不同變量,配合Resources和Filter來指定打包內容以及替換變量。

jdbc:    username: root

resources

用來操作編譯文件

filters

過濾器,設置過濾器的資源將會對同名變量進行賦值(被賦值的資源文件需要設置filtering為true)

多環境配置解決方案

網上大多數都是分為application-dev.xml、application-test.xml、application-prod.xml三個文件,可是我們在真實項目開發中,將會用到很多各式各樣的文件(例如log4j的配置文件),它們在不同環境中應該也是不同的配置,不能在測試和生產環境使用同一個配置文件。所以我們將分為三個文件夾分別代表開發環境、測試環境、生產環境,他們裏面的配置文件種類一致但是內容不一樣。選擇完當前環境後,打的jar包只包含當前環境文件夾下的配置文件。

├─main  │  ├─java  │  │  └─......  │  └─resources  │      ├─dev  │      │   └─config  │      │   │   └─mq.yml  │      │   │   └─redis.yml  │      │   └─application-dev.yml  │      ├─prod  │      │  └─config  │      │  │    └─mq.yml  │      │  │    └─redis.yml  │      │  └─application-prod.yml  │      └─test  │      │  └─config  │      │  │    └─mq.yml  │      │  │    └─redis.yml  │      │  └─application-test.yml  │      └─application.yml  │      └─a.xml  └─test      └─java          └─......

dev下的config下的mq.yml

mq: mq-dev

dev下的config下的redis.yml

redis: redis-dev

dev下的application-dev.yml

profiles.active:    dev  port: dev-port

application.yml

spring:    profiles:      active: ${profiles.active}    port: ${port}

查看編譯後的結果

其中application.yml中變量已經被替換為

spring:    profiles:      active: dev  port: dev-port

完整的pom.xml

    <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-resources-plugin</artifactId>                  <version>3.1.0</version>                  <!--使用默認的變量分割符即${}-->                  <configuration>                      <useDefaultDelimiters>true</useDefaultDelimiters>                  </configuration>              </plugin>          </plugins>            <!-- 測試文件的編譯路徑設置 -->          <testResources>              <testResource>                  <!--這裡是關鍵! 根據不同的環境,把對應文件夾里的配置文件打包-->                  <directory>src/main/resources</directory>                  <includes>                      <include>application.yml</include>                  </includes>                  <filtering>true</filtering>              </testResource>                <testResource>                  <!--這裡是關鍵! 根據不同的環境,把對應文件夾里的配置文件打包-->                  <directory>src/main/resources/${profiles.active}</directory>                  <includes>                      <include>**/*.yml</include>                  </includes>                  <filtering>false</filtering>              </testResource>          </testResources>            <resources>              <resource>                  <!--打包該目錄下的 application.yml -->                  <directory>src/main/resources</directory>                  <includes>                      <include>application.yml</include>                  </includes>                  <!-- 啟用過濾 即該資源中的變量將會被過濾器中的值替換 -->                  <filtering>true</filtering>              </resource>              <resource>                  <directory>src/main/resources</directory>                  <includes>                      <include>**/*.properties</include>                      <include>**/*.xml</include>                  </includes>                  <filtering>false</filtering>              </resource>              <resource>                  <!-- ${profiles.active}由profile提供 -->                  <directory>src/main/resources/${profiles.active}</directory>                  <includes>                      <include>**/*.yml</include>                  </includes>                  <filtering>false</filtering>              </resource>            </resources>            <!-- 定義 filter,即該資源中的值將會用來替換同名屬性(設置 filtering 為 true 的資源中的屬性)-->          <filters>            <filter>                src/main/resources/${profiles.active}/application-${profiles.active}.yml            </filter>          </filters>      </build>        <profiles>          <profile>              <!-- 本地開發環境 -->              <id>dev</id>              <properties>                  <profiles.active>dev</profiles.active>              </properties>              <activation>                  <activeByDefault>true</activeByDefault>              </activation>            </profile>            <profile>              <!-- 測試環境 -->              <id>test</id>              <properties>                  <profiles.active>test</profiles.active>              </properties>          </profile>            <profile>              <!-- 生產環境 -->              <id>prod</id>              <properties>                  <profiles.active>prod</profiles.active>              </properties>          </profile>      </profiles>