多環境構建

內置屬性

${basedir}:表示項目根目錄,即包含pom.xml文件的目錄
${version}:表示項目的版本號

POM屬性

${pom.build.sourceDirectory}:項目的主源碼目錄,默認爲src/main/java/
${project.build.testSourceDirectory}:項目的測試源碼目錄,默認爲src/test/java/
${project.build.directory}:項目構建輸出目錄,默認爲target/
${project.build.outputDirectory}:項目主代碼編譯輸出目錄,默認爲target/classes
${project.build.testOutputDirectory}:項目測試代碼編譯輸出目錄,默認爲target/test-classes
${project.groupId}:項目的groupId
${project.artifactId}:項目的artifactId
${project.version}:項目的version,與${version}等價
${project.build.finalName}:項目打包輸出文件的名稱,默認爲${project.artifactId}-${project.version}

Settings屬性

這種屬性以settings.開頭來引用~/.m2/settings.xml中的內容,如:

#指向用戶本地倉庫的地址。
${settings.localRepository}

java系統屬性

所有java系統屬性都可以使用maven屬性來進行引用,例如${user.home}指向了當前用戶目錄。

java系統屬性可以通過mvn help:system命令看到。

環境變量屬性

所有的環境變量都可以使用env.開頭的方式來進行引用,如:

# 可以獲取環境變量JAVA_HOME的值。
${env.JAVA_HOME}

用戶可以使用mvn help:system命令查看所有環境變量的值。

上面的maven屬性,我們在pom.xml中通過${屬性名稱}可以靈活的引用,對我們寫pom.xml文件幫助還是比較大的。

案例

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 配置maven編譯的時候採用的編譯器版本 -->
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        <!-- 指定源代碼是什麼版本的 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- maven中執行編譯的時候會用到這個配置 -->
        <maven.compiler.target>1.8</maven.compiler.target>

        <!--//////////////////// [maven 屬性引用: 通過命令查看變量內容: mvn help:effective-pom > mvn.xml] /////////////////////////////-->
        <!-- 項目的主源碼目錄,默認爲src/main/java/ -->
        <a>${pom.build.sourceDirectory}</a>
        <!-- 項目的測試源碼目錄,默認爲src/test/java/ -->
        <b>${project.build.testSourceDirectory}</b>
        <!-- 項目構建輸出目錄,默認爲target/ -->
        <c>${project.build.directory}</c>
        <!-- 項目主代碼編譯輸出目錄,默認爲target/classes -->
        <d>${project.build.outputDirectory}</d>
        <!-- 項目測試代碼編譯輸出目錄,默認爲target/test-classes -->
        <e>${project.build.testOutputDirectory}</e>
        <!-- 項目的groupId -->
        <f>${project.groupId}</f>
        <!-- 項目的artifactId -->
        <g>${project.artifactId}</g>
        <!-- 項目的version,與${version}等價-->
        <h>${project.version}</h>
        <!-- 項目打包輸出文件的名稱,默認爲${project.artifactId}-${project.version} -->
        <i>${project.build.finalName}</i>

        <!-- setting屬性 -->
        <!-- 獲取本地倉庫地址-->
        <a1>${settings.localRepository}</a1>

        <!-- 系統屬性 -->
        <!-- 用戶目錄 -->
        <a2>${user.home}</a2>

        <!-- 環境變量屬性,獲取環境變量JAVA_HOME的值 -->
        <a3>${env.JAVA_HOME}</a3>
    </properties>

多套環境構建問題

理解資源文件打包過程

resources目錄中的文件一般放的都是配置文件,配置文件一般最好我們都不會寫死,所以此處有幾個問題:

  1. 這個插件複製資源文件如何設置編碼?
  2. 複製的過程中是否能夠對資源文件進行替換,比如在資源文件中使用一些佔位符,然後複製過程中對這些佔位符進行替換。

maven-resources-plugin這個插件也想到了這個功能,幫我們提供了這樣的功能

設置資源文件複製過程採用的編碼

<properties>
    <encoding>UTF-8</encoding>
</properties>

設置資源文件內容動態替換

資源文件中可以通過@maven屬性@來引用maven屬性中的值,打包的過程中這些會被替換掉,替換的過程默認是不開啓的,需要手動開啓配置。
修改src/main/resource/jdbc.properties內容如下:

jdbc.url=@jdbc.url@
jdbc.username=@jdbc.username@
jdbc.password=@jdbc.password@

在配置文件中引用 pom 中的 properties 變量時,默認使用 @ 來獲取

pom.xml 中的配置

<!-- 自義定屬性在配置文件 jdbc.properties 中獲取 -->
        <jdbc.url>jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8</jdbc.url>
        <jdbc.username>root</jdbc.username>
        <jdbc.password>root</jdbc.password>

<build> 下 <resources> 標籤配置如下:

        <resources>
            <resource>
                <!-- 指定資源文件的目錄 -->
                <directory>${project.basedir}/src/main/resources</directory>
                <!-- 是否開啓過濾替換配置,默認是不開啓的 -->
                <filtering>true</filtering>
            </resource>
        </resources>

自定義替換的分隔符

自定義分隔符,需要我們配置maven-resources-plugin插件的參數,如下:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <!-- 是否使用默認的分隔符,默認分隔符是${*}和@ ,這個地方設置爲false,表示不啓用默認分隔符配置-->
            <useDefaultDelimiters>false</useDefaultDelimiters>
            <!-- 自定義分隔符 -->
            <delimiters>
                <delimiter>$*$</delimiter>
                <delimiter>##</delimiter>
            </delimiters>
        </configuration>
    </plugin>
</plugins>

delimiters中可以配置多個delimiter,可以配置#*#,其中的*表示屬性名稱,那麼資源文件中的#屬性名#在複製的過程中會被替換掉,*前後都是#,表示前後分隔符都一樣,那麼可以簡寫爲#,所以#*##寫法是一樣的,我們去看一下源碼,delimiters的默認值如下:

AbstractMavenFilteringRequest 類

    private void initDefaults() {
        this.projectStartExpressions.add("pom");
        this.projectStartExpressions.add("project");
        this.delimiters.add("${*}");
        this.delimiters.add("@");
    }
maven resources 目標執行

maven 中執行 資源打包操作

 mvn resources:resources

maven plugin 插件debug

  1. 啓動debug

    mvnDebug -Dplugin=org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources
    
  2. maven plugin debug 啓動配置
    在這裏插入圖片描述
    在這裏插入圖片描述

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

指定需要替換的資源文件

            <resource>
                <!-- 指定資源文件的目錄 -->
                <directory>${project.basedir}/src/main/resources</directory>
                <!-- 是否開啓過濾替換配置,默認是不開啓的 -->
                <filtering>true</filtering>
                <!--需要被處理的文件列表-->
                <includes>
                    <include>**/jdbc.properties</include>
                </includes>
                <!--排除需要被處理的資源文件列表-->
                <excludes>
                    <exclude>**/const.properties</exclude>
                </excludes>
            </resource>

上面使用includes列出需要被處理的,使用excludes排除需要被處理的資源文件列表,採用通配符的寫法,**匹配任意深度的文件路徑,*匹配任意個字符。

多個resource元素的使用案例

<resources>

     <!-- jdbc.properties 被複制到target下面,但是需要替換裏面的內容 -->
    <resource>
        <!-- 指定資源文件的目錄 -->
        <directory>${project.basedir}/src/main/resources</directory>
        <!-- 是否開啓過濾替換配置,默認是不開啓的 -->
        <filtering>true</filtering>
        <includes>
            <include>**/jdbc.properties</include>
        </includes>
    </resource>
    
    <!-- const.propertis只是被複制到target下面,但是不要去替換裏面的內容 -->
    <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <includes>
            <include>**/const.properties</include>
        </includes>
    </resource>
</resources>

使用profiles處理多環境構建問題

maven支持讓我們配置多套環境,每套環境中可以指定自己的maven屬性,mvn命令對模塊進行構建的時候可以通過-P參數來指定具體使用哪個環境的配置.

profiles元素支持定義多套環境的配置信息,配置如下用法:

<profiles>
    <profile>測試環境配置信息</profile>
    <profile>開發環境配置信息</profile>
    <profile>線上環境配置信息</profile>
    <profile>環境n配置信息</profile>
</profiles>

profiles中包含多個profile元素,每個profile可以表示一套環境,profile示例如下:

<profile>
    <id>dev</id>
    <properties>
        <jdbc.url>dev jdbc url</jdbc.url>
        <jdbc.username>dev jdbc username</jdbc.username>
        <jdbc.password>dev jdbc password</jdbc.password>
    </properties>
</profile>

id:表示這套環境的標識信息,properties可以定義環境中使用到的屬性列表。
執行mvn命令編譯的時候可以帶上一個-P profileid來使用指定的環境進行構建。

指定環境進行構建

執行命令

mvn clean package  -Pdev

pom.xml 配置

<profiles>
    <!-- 開發環境使用的配置 -->
    <profile>
        <id>dev</id>
        <properties>
            <jdbc.url>dev jdbc url</jdbc.url>
            <jdbc.username>dev jdbc username</jdbc.username>
            <jdbc.password>dev jdbc password</jdbc.password>
        </properties>
    </profile>
    <!-- 測試環境使用的配置 -->
    <profile>
        <id>test</id>
        <properties>
            <jdbc.url>test jdbc url</jdbc.url>
            <jdbc.username>test jdbc username</jdbc.username>
            <jdbc.password>test jdbc password</jdbc.password>
        </properties>
    </profile>
    <!-- 線上環境使用的配置 -->
    <profile>
        <id>prod</id>
        <properties>
            <jdbc.url>test jdbc url</jdbc.url>
            <jdbc.username>test jdbc username</jdbc.username>
            <jdbc.password>test jdbc password</jdbc.password>
        </properties>
    </profile>
</profiles>

注意上面命令中多了一個-Pdev參數,-P後面跟的是pom.xmlprofile的id,表示需要使用那套環境進行構建。此時我們使用的是dev環境,即開發環境。

查看目前有哪些環境

mvn help:all-profiles

查看目前激活的是哪些環境

mvn help:active-profiles

b2b 項目多模塊資源打包

mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev

profile元素更強大的功能

profile元素可以用於對不同環境的構建進行配置,project中包含的元素,在profile元素中基本上都有,所以profile可以定製更復雜的構建過程,不同的環境依賴的構件、插件、build過程、測試過程都是不一樣的,這些都可以在profile中進行指定,也就是說不同的環境所有的東西都可以通過profile元素來進行個性化的設置.
在這裏插入圖片描述

參考

多環境構建
maven屬性定義與使用
maven佔位符的使用
Maven 整合 spring profile實現多環境自動切換
maven佔位符官網文檔
如何調試 Maven Plugin
maven插件開發官網文檔

發佈了19 篇原創文章 · 獲贊 2 · 訪問量 1411
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章