Maven 使用 Profile 構(gòu)建
上一節(jié),我們講到了如何使用 Maven 自動化的進(jìn)行單元測試,那測試通過之后,我們就要進(jìn)行構(gòu)建,并且將構(gòu)建好的程序包,放到對應(yīng)的服務(wù)器上去運行。這個時候,問題就出現(xiàn)了,對于不同環(huán)境,我們需要不同的配置文件,那我們構(gòu)建的之前,就需要將配置文件改為對應(yīng)環(huán)境的配置文件,之后才能進(jìn)行構(gòu)建??偠灾苈闊?,而且,萬一忘記改配置,那么構(gòu)建出來的包就是錯的。
Profile 則讓不同環(huán)境之間可移植性的構(gòu)建成為可能。它使我們在構(gòu)建項目的時候,可以很輕松的在不同環(huán)境中進(jìn)行構(gòu)建,也可以稱之為“開箱即用”。
1. 可移植性
首先,我們來介紹一下可移植性。所謂的可移植性,指的是,在構(gòu)建的過程中,改動配置文件的次數(shù)和范圍越小,則可移植性越強(qiáng),反之,則可移植性越弱。根據(jù)可移植性的不同程度,我們可以將其劃分為如下幾類:
-
不可移植: 指的是,項目只能在某個特定環(huán)境或者條件下才能構(gòu)建。這種時候,構(gòu)建是不可移植的,當(dāng)然,我們在開發(fā)的過程中,肯定是不想看到這種情況的發(fā)生。
-
環(huán)境可移植: 指的是,對于不同環(huán)境添加不同的配置,一次構(gòu)建都能夠完成,那么這個構(gòu)建就具備環(huán)境可移植了。即:無需對不同環(huán)境做過多改動,即可完成相應(yīng)構(gòu)建。
-
全局可移植: 指的是,無論在何種環(huán)境下,開發(fā)者都不需要做任何配置,即可完成對項目的構(gòu)建工作。這個特性對于優(yōu)秀的開源軟件來說,尤其重要。因為這種類型的軟件,往往會由來自各地的開發(fā)者來共同開發(fā)。
在大多數(shù)情況下,我們平時開發(fā)的項目只需要做到環(huán)境可移植就可以了。因為通常的公司往往會有三套環(huán)境,開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境,針對不同的開發(fā)階段,往往需要將項目構(gòu)建到不同的環(huán)境中去,但是由于這些項目通常部署在公司的內(nèi)網(wǎng)環(huán)境中,所以,我們并不需要考慮做到全局可移植性。
2. Maven Profile
在了解了什么是可移植性之后,那我們來看看 Maven 是如何實現(xiàn)可移植性的。這里就需要介紹 Maven 的一組配置 Profile 。通過使用 Profile 我們就可以實現(xiàn)針對不同環(huán)境自定義進(jìn)行構(gòu)建。通常情況下,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>
這里我們以數(shù)據(jù)庫連接串為例,可以將不同環(huán)境中的數(shù)據(jù)庫連接串配置到對應(yīng)的 profile 節(jié)點中,并為每個 profile 節(jié)點定義單獨的 id 。配置好之后,我們我們在進(jìn)行構(gòu)建項目的時候,可以在執(zhí)行命令的時候,加上參數(shù) -Pdev 來指定對應(yīng)的配置 :mvn clean package -Pdev
。
但是問題來了,通常情況下,我們不會把配置信息放到 pom.xml 文件中,這樣對于我們管理配置,并不方便。那我們?nèi)绾卧跇?gòu)建的時候,指定使用對應(yīng)的配置文件來進(jìn)行構(gòu)建呢?我們可以對 pom.xml 文件進(jìn)行簡單的修改。
<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>
<!-- 打包時,將對應(yīng)配置文件先排除 -->
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
<includes>
<!--如果有其他定義通用文件,需要包含進(jìn)來-->
</includes>
</resource>
<resource>
<!-- 通過自定義的節(jié)點來激活指定的配置文件 -->
<directory>src/main/resources/${profile.active}</directory>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 自定義節(jié)點profile.active-->
<profile.active>dev</profile.active>
</properties>
<!--activation用來指定激活方式,可以根據(jù)jdk環(huán)境,環(huán)境變量,文件的存在或缺失-->
<activation>
<!-- 表示默認(rèn)激活-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
</properties>
</profile>
</profiles>
首先,我們定義 resource 節(jié)點用于指定配置文件的目錄,并將最后一級目錄定義成可配置的。然后,跟剛剛類似,我們開始定義 profiles 節(jié)點,只不過這次,我們只是在 properties 節(jié)點中自定義了一個節(jié)點,與 resource 中的自定義路徑相呼應(yīng)。相應(yīng)的,我們需要在 resources目錄下,創(chuàng)建兩個目錄,分別為 dev 和 prod 目錄,用于存放不同的配置文件。
都配置好之后,我們再使用命令 mvn clean package -Pdev
來構(gòu)建項目。構(gòu)建完成后,我們查看目錄target\classes
會發(fā)現(xiàn),application-dev.yml 配置文件被編譯進(jìn)來,而另一個配置文件并沒有被編譯進(jìn)來。這時候,我們的基本上就達(dá)成 了。
注意:由于我們這里配置的 dev Profile 是默認(rèn)激活狀態(tài)的,所以執(zhí)行 mvn clean package
和 mvn clean package -Pdev
兩個命令的結(jié)果是相同的。
當(dāng)然,通過配置 profile ,我們不僅僅可以指定激活不同的配置文件,也可以指定構(gòu)建使用的JDK版本,以及某些操作系統(tǒng)的參數(shù)。
3. 小結(jié)
本節(jié)中,我們主要介紹了 Maven 的一個屬性,叫做 Profile 。通過配置 Profile 我們可以實現(xiàn)構(gòu)建的環(huán)境可移植性,從而大大簡化我們在構(gòu)建過程中的便捷程度,讓我們從重復(fù)的修改配置的過程中解脫出來。