maven 利用 profile 進行多環境配置


我們在進行項目的多環境配置時,有很多種方式供我們選擇,比如 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM