我們在進行項目的多環境配置時,有很多種方式供我們選擇,比如 SpringBoot 自帶的 application-dev.yml、maven 的 profile 等。這裡介紹的就是如何利用 profile 進行多環境配置。
首先,在 pom.xml 中添加你需要的 profile 配置:
<profiles>
<!-- 開發環境 -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<!-- 生産環境 -->
<profile>
<id>publish</id>
<properties>
<env>publish</env>
</properties>
</profile>
<!-- 本地環境 -->
<profile>
<id>local</id>
<properties>
<env>local</env>
</properties>
<!--預設啟用-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
profiles 裡面配置了多個 profile 檔案,即 dev、publish、local 環境,<env> 标簽是為了切換環境,激活不同的環境需要。<activeByDefault> 設定為 true 表明:該 profile 是預設激活狀态。
接下來,我們要将 <resource> 的 <filtering> 标簽設定為 true,表示啟用參數化值來替換标記,而參數化值源于 filter 标簽中的 properties 檔案。以下是原文解釋:
Whether resources are filtered to replace tokens with parameterised values or not.
The values are taken from the <code>properties</code> element and from the properties in the files listed
in the <code>filters</code> element.
<build>
<!-- 指定使用filter -->
<filters>
<filter>src/main/resources/profiles/${env}/env.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<excludes>
<exclude>profiles/**</exclude>
</excludes>
<filtering>true</filtering>
</resource>
</resources>
</build>
<filter> 中引用了 <profile> 的 env 屬性,表示讀取哪個環境變量的值,不同的 properties 檔案中配置了不同環境的值:

前面說到 <filtering>true</filtering> 表示啟用參數化值來替換标記,這是什麼意思呢?我們來看看 application.yml 中要怎麼表示?
server:
port: 8080
tomcat:
max-threads: 800
uri-encoding: UTF-8
spring:
redis:
host: ${spring.redis.host}
timeout: ${spring.redis.timeout}
pool:
max-idle: ${spring.redis.pool.max-idle}
max-active: ${spring.redis.pool.max-active}
password: ${spring.redis.password}
database: ${spring.redis.database}
那麼問題來了,maven 怎麼認識到 ${*} 這個符号是标記呢?這個标記符号是在 <plugin> 中的 <delimiter> 設定的,其中 <nonFilteredFileExtension> 表示不需要替換的檔案擴充名。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<delimiters>
<delimiter>${*}</delimiter>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>store</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
是以,整個流程應該是這樣進行的:執行 maven compile 指令, <resource> 讀取 <filter> 中 properties 的屬性值,然後替換 src/main/resources 下中的标記 — 諸如 ${spring.redis.host} 這些。
最後,隻剩下一個問題了,怎麼切換環境呢?如果你開發的工具是 IDEA,直接在旁邊視窗切換即可:
如果使用指令行編譯,加上
-P選擇 profile 即可,如下:
clean -U package -P dev -DskipTests=true -f pom.xml