Maven學習之路(五)maven的靈活構建--屬性、profile和資源過濾
前言
在很多情況下,我們希望專案在不同的階段有不同的構建,開發的時候,使用開發的環境配置,測試的時候,使用測試的環境配置,上線的時候使用其他的配置,雖然說,每次切換專案執行的環境的時候,我們可以手動更改配置,但這樣難免有疏漏之處,導致專案構建的失敗。這個時候,我們就需要Maven進行靈活的構建,使用屬性、profile和資源過濾三個特性達到根據不同的環境構建專案的目的。
一、Maven 屬性
最常見的用法–自定義的Maven屬性
使用properties自定義屬性,,然後使用${}引用上滿定義的屬性
<-定義屬性---> <properties> <oneVirsion>xxxxx</oneVirsion> </properties> <!--使用屬性--> <dependencyManagement> <dependency> <groupId>...</groupId> <artifactId>...</artifactId> <version>${oneVirsion}</version> </dependency> </dependencyManagement>
maven內建的屬性
主要有兩個內建屬性
- ${basedir} 表示專案的根目錄,即包含pom.xml的目錄
- ${version} 表示專案的版本
POM屬性
使用者可以使用引用POM檔案對應元素的值,例如${project.artifacId},對應了< project > < aritfactId >元素的值。
常用屬性
${project.build.sourceDirectory}:專案的主原始碼目錄,預設為src/main/java ${project.build.testSourceDirectory}:專案的測試原始碼目錄,預設為src/test/java ${project.build.directory}:專案構件輸出目錄,預設為target/ ${project.outputDirectory}:專案主程式碼編譯輸出目錄,預設為target/classes/ ${project.testOutputDirectory}:專案測試程式碼編譯輸出目錄,預設為target/test-classes/ ${project.groupId}:專案的groupId ${project.artifactId}:專案的artifactId ${project.version}:專案的version,與${version}等價 ${project.build.fianlName}:專案打包輸出檔案的名稱。預設為${project.artifactId}-${project.version}
settings.xml 屬性
可以使用sttings. 開頭的屬性引用settings.xml檔案中XML元素的值,例如常用的${settings.localRespository}指向使用者本地倉庫的地址。
Java系統屬性
所有的Java系統屬性都可以使用Maven屬性引用。例如${user.home}指向了使用者目錄。可以使用mvn help:system 檢視所有的Java系統屬性。
環境變數屬性
所有的環境邊浪都可以使用以env.開頭的Maven屬性引用。例如${env.JAVA_HOME},指代了JAVA_HOME環境變數的值。使用者可以使用mvn help:system檢視所有的環境變數。
二、資源過濾
上面說了Maven有哪些屬性可以使用,但是,只有在pom檔案中,$ {xxx}才會被解析,如何在專案的配置檔案中(例如日誌配置檔案、資料庫配置檔案等)使用${xxx}呢?我們需要配置Maven對含有 ${}屬性引用的專案配置檔案進行文字替換,具體方式就是,配置資源的過濾。
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<!--開啟資源過濾,專案構建時會將當前資原始檔中Maven的屬性檔案替換為配置的檔案-->
<filtering>true</filtering>
</resource>
</resources>
這裡需要注意以下幾點:
- 超級pom中定義了專案預設的資原始檔夾為${project.basedir}/src/main/resources
- 需要開啟資源過濾
下面舉個例子:
開啟資源過濾
引用Maven屬性
檢視專案構建後,Maven屬性有沒有替換
圖中顯示Maven屬性已經被替換。
三、profile
profile允許你定義一個環境,在這個環境中你可以自由定製自己所需的專案構建方式。
下面,結合上面介紹的Maven屬性和資源過濾,實現不同環境下,配置檔案中的desc被配置成不同的值:
配置自定義屬性,並開啟資源過濾
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.souche</groupId>
<artifactId>log-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>log-demo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<profiles>
<!--不同構建環境下,desc配置不同的值-->
<profile>
<id>p1</id>
<properties>
<desc>profile的id為p1時,啦啦啦啦</desc>
</properties>
</profile>
<profile>
<id>p2</id>
<properties>
<desc>profile的id為p2時,嘟嘟嘟嘟嘟</desc>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!--配置資源過濾-->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
配置檔案中引用profile中自定義的屬性。
構建專案,並激活(有多種方式,我們先選命令列啟用的方式)不同profile
- 啟用p1
mvn clean package -DskipTests -Pp1
結果
- 啟用p2
mvn clean package -DskipTests -Pp2
結果
3.1、profile配置
Profile能讓你為一個特殊的環境自定義一個特殊的構建;profile使得不同環境間構建的可移植性成為可能。Maven中的profile是一組可選的配置,可以用來設定或者覆蓋配置預設值。有了profile,你就可以為不同的環境定製構建。profile可以在pom.xml中配置,並給定一個id。然後你就可以在執行Maven的時候使用的命令列標記告訴Maven執行特定profile中的目標。一個Profiles下面允許出現的元素:
<project>
<profiles>
<profile>
<build>
<defaultGoal>...</defaultGoal>
<finalName>...</finalName>
<resources>...</resources>
<testResources>...</testResources>
<plugins>...</plugins>
</build>
<reporting>...</reporting>
<modules>...</modules>
<dependencies>...</dependencies>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<properties>...</properties>
</profile>
</profiles>
</project>
3.2、啟用profile
命令列啟用
使用-P引數,後面緊跟profile的id來啟用profile
例如上面的例子
mvn clean package -DskipTests -Pp2