亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Maven 使用 Profile 構建

上一節,我們講到了如何使用 Maven 自動化的進行單元測試,那測試通過之后,我們就要進行構建,并且將構建好的程序包,放到對應的服務器上去運行。這個時候,問題就出現了,對于不同環境,我們需要不同的配置文件,那我們構建的之前,就需要將配置文件改為對應環境的配置文件,之后才能進行構建。總而言之,很麻煩,而且,萬一忘記改配置,那么構建出來的包就是錯的。

Profile 則讓不同環境之間可移植性的構建成為可能。它使我們在構建項目的時候,可以很輕松的在不同環境中進行構建,也可以稱之為“開箱即用”。

1. 可移植性

首先,我們來介紹一下可移植性。所謂的可移植性,指的是,在構建的過程中,改動配置文件的次數和范圍越小,則可移植性越強,反之,則可移植性越弱。根據可移植性的不同程度,我們可以將其劃分為如下幾類:

  • 不可移植: 指的是,項目只能在某個特定環境或者條件下才能構建。這種時候,構建是不可移植的,當然,我們在開發的過程中,肯定是不想看到這種情況的發生。

  • 環境可移植: 指的是,對于不同環境添加不同的配置,一次構建都能夠完成,那么這個構建就具備環境可移植了。即:無需對不同環境做過多改動,即可完成相應構建。

  • 全局可移植: 指的是,無論在何種環境下,開發者都不需要做任何配置,即可完成對項目的構建工作。這個特性對于優秀的開源軟件來說,尤其重要。因為這種類型的軟件,往往會由來自各地的開發者來共同開發。

在大多數情況下,我們平時開發的項目只需要做到環境可移植就可以了。因為通常的公司往往會有三套環境,開發環境,測試環境,生產環境,針對不同的開發階段,往往需要將項目構建到不同的環境中去,但是由于這些項目通常部署在公司的內網環境中,所以,我們并不需要考慮做到全局可移植性。

2. Maven Profile

在了解了什么是可移植性之后,那我們來看看 Maven 是如何實現可移植性的。這里就需要介紹 Maven 的一組配置 Profile 。通過使用 Profile 我們就可以實現針對不同環境自定義進行構建。通常情況下,Profile 被定義在 pom.xml 文件中,但是定義的方式也可以有很多種。

<profiles>
   <profile>
        <id>dev</id>
        <properties>
            <database.driver>com.mysql.cj.jdbc.Driver</database.driver>
            <database.url>jdbc:mysql://localhost:3306/dev</database.url>
            <database.username>Mic</database.username>
            <database.password>Abc123</database.password>
        </properties>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <database.driver>com.mysql.cj.jdbc.Driver</database.driver>
            <database.url>jdbc:mysql://localhost:3306/test</database.url>
            <database.username>Mic</database.username>
            <database.password>Abc123</database.password>
        </properties>
     </profile>
</profiles>

這里我們以數據庫連接串為例,可以將不同環境中的數據庫連接串配置到對應的 profile 節點中,并為每個 profile 節點定義單獨的 id 。配置好之后,我們我們在進行構建項目的時候,可以在執行命令的時候,加上參數 -Pdev 來指定對應的配置 :mvn clean package -Pdev。

但是問題來了,通常情況下,我們不會把配置信息放到 pom.xml 文件中,這樣對于我們管理配置,并不方便。那我們如何在構建的時候,指定使用對應的配置文件來進行構建呢?我們可以對 pom.xml 文件進行簡單的修改。

<build>
    <finalName>mall-order</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
            	<executable>true</executable>
            </configuration>
        </plugin>
    </plugins>

    <resources>
        <resource>
        	<directory>src/main/resources/</directory>
        	<!-- 打包時,將對應配置文件先排除 -->
            <excludes>
            	<exclude>**/*.yml</exclude>
            </excludes>
            <includes>
            <!--如果有其他定義通用文件,需要包含進來-->
            </includes>
        </resource>
        <resource>
            <!-- 通過自定義的節點來激活指定的配置文件 -->
            <directory>src/main/resources/${profile.active}</directory>
        </resource>
    </resources>
</build>

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <!-- 自定義節點profile.active-->
            <profile.active>dev</profile.active>
        </properties>
        <!--activation用來指定激活方式,可以根據jdk環境,環境變量,文件的存在或缺失-->
        <activation>
            <!-- 表示默認激活-->
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
        	<profile.active>test</profile.active>
        </properties>
    </profile>
</profiles>

首先,我們定義 resource 節點用于指定配置文件的目錄,并將最后一級目錄定義成可配置的。然后,跟剛剛類似,我們開始定義 profiles 節點,只不過這次,我們只是在 properties 節點中自定義了一個節點,與 resource 中的自定義路徑相呼應。相應的,我們需要在 resources目錄下,創建兩個目錄,分別為 dev 和 prod 目錄,用于存放不同的配置文件。

都配置好之后,我們再使用命令 mvn clean package -Pdev 來構建項目。構建完成后,我們查看目錄target\classes 會發現,application-dev.yml 配置文件被編譯進來,而另一個配置文件并沒有被編譯進來。這時候,我們的基本上就達成 了。

注意:由于我們這里配置的 dev Profile 是默認激活狀態的,所以執行 mvn clean packagemvn clean package -Pdev 兩個命令的結果是相同的。

當然,通過配置 profile ,我們不僅僅可以指定激活不同的配置文件,也可以指定構建使用的JDK版本,以及某些操作系統的參數。

3. 小結

本節中,我們主要介紹了 Maven 的一個屬性,叫做 Profile 。通過配置 Profile 我們可以實現構建的環境可移植性,從而大大簡化我們在構建過程中的便捷程度,讓我們從重復的修改配置的過程中解脫出來。