什么是構(gòu)建生命周期
| 階段 | 處理 | 描述 |
|---|---|---|
| 準(zhǔn)備資源 | 資源復(fù)制 | 資源復(fù)制可以進(jìn)行定制 |
| 編譯 compile | 執(zhí)行編譯 | 源代碼編譯在此階段完成 |
| 包裝 package | 打包 | 創(chuàng)建JAR/WAR包如在 pom.xml 中定義提及的包 |
| 安裝 install | 安裝 | 這一階段在本地/遠(yuǎn)程Maven倉庫安裝程序包 |
Maven的構(gòu)建過程被分解為構(gòu)建生命周期、階段和目標(biāo)。一個構(gòu)建周期由一系列的構(gòu)建階段組成,每一個構(gòu)建階段由一系列的目標(biāo)組成。當(dāng)你運(yùn)行Maven的時候,你會傳入一條命令。這條命令就是構(gòu)建生命周期、階段或目標(biāo)的名字。如果執(zhí)行一個生命周期,該生命周期內(nèi)的所有構(gòu)建階段都會被執(zhí)行。如果執(zhí)行一個構(gòu)建階段,在預(yù)定義的構(gòu)建階段中,所有處于當(dāng)前構(gòu)建階段之前的階段也都會被執(zhí)行。
一個典型的 Maven 構(gòu)建生命周期是由下列順序的階段:
| 階段 | 處理 | 描述 |
|---|---|---|
| 準(zhǔn)備資源 | 資源復(fù)制 | 資源復(fù)制可以進(jìn)行定制 |
| 編譯 compile | 執(zhí)行編譯 | 源代碼編譯在此階段完成 |
| 包裝 package | 打包 | 創(chuàng)建JAR/WAR包如在 pom.xml 中定義提及的包 |
| 安裝 install | 安裝 | 這一階段在本地/遠(yuǎn)程Maven倉庫安裝程序包 |
Maven 的內(nèi)部有三個構(gòu)建生命周期,分別是 clean, default, site。其中 default 生命周期包含有23個階段,其核心階段如下所示:
| 生命周期階段 | 描述 |
|---|---|
| validate | 檢查工程配置是否正確,完成構(gòu)建過程的所有必要信息是否能夠獲取到。 |
| compile | 編譯工程源碼。 |
| test | 使用適當(dāng)?shù)膯卧獪y試框架(例如JUnit)運(yùn)行測試。 |
| package | 獲取編譯后的代碼,并按照可發(fā)布的格式進(jìn)行打包,例如 JAR、WAR 或者 EAR 文件。 |
| verify | 運(yùn)行檢查操作來驗(yàn)證工程包是有效的,并滿足質(zhì)量要求。 |
| install | 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴。 |
| deploy | 拷貝最終的工程包到遠(yuǎn)程倉庫中,以共享給其他開發(fā)人員和工程。 |

| 生命周期階段 | 描述 |
|---|---|
| validate | 檢查工程配置是否正確,完成構(gòu)建過程的所有必要信息是否能夠獲取到。 |
| compile | 編譯工程源碼。 |
| test | 使用適當(dāng)?shù)膯卧獪y試框架(例如JUnit)運(yùn)行測試。 |
| package | 獲取編譯后的代碼,并按照可發(fā)布的格式進(jìn)行打包,例如 JAR、WAR 或者 EAR 文件。 |
| verify | 運(yùn)行檢查操作來驗(yàn)證工程包是有效的,并滿足質(zhì)量要求。 |
| install | 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴。 |
| deploy | 拷貝最終的工程包到遠(yuǎn)程倉庫中,以共享給其他開發(fā)人員和工程。 |
當(dāng)一個階段通過 Maven 命令調(diào)用時,例如 mvn compile,只有該階段之前以及包括該階段在內(nèi)的所有階段會被執(zhí)行。
不同的 maven 目標(biāo)將根據(jù)打包的類型(JAR / WAR / EAR),被綁定到不同的 Maven 生命周期階段。
可以指定多個不同構(gòu)建生命周期的階段,執(zhí)行 mvn clean deploy 命令,首先完成的 clean lifecycle,將以前構(gòu)建的文件清理,然后再執(zhí)行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 階段,將 package 階段創(chuàng)建的包發(fā)布到遠(yuǎn)程倉庫中。
階段與插件的關(guān)系
Maven 將構(gòu)建過程定義為 default lifecycle,并將 default lifecycle 劃分為一個個的階段 phase,這一系列 phase 僅僅是規(guī)定執(zhí)行順序,每個階段做什么工作?有誰來做,是由插件(plugins)來處理的。
一個插件可以支持多種功能,稱之為目標(biāo)(goal),例如:compiler 插件有兩個目標(biāo):compile 和 testCompile,分別實(shí)現(xiàn)編譯源代碼 和 編譯測試代碼。
通過將插件的目標(biāo)(goal)與 build lifecycle 中 phase 綁定到一起,這樣,當(dāng)要執(zhí)行某個 phase 時,就調(diào)用插件來完成綁定的目標(biāo)。
從圖中可以看出,每一個階段可以綁定0 個 或 多個目標(biāo),每個插件可以提供 1 個或多個目標(biāo)。

如何為工程創(chuàng)建構(gòu)建生命周期
| 階段 | 目標(biāo) |
|---|---|
| process-resources | resources:resources |
| compile | compiler:compile |
| process-test-resources | resources:testResources |
| test-compile | compiler:testCompile |
| test | surefire:test |
| package | jar:jar |
| install | install:install |
| deploy | deploy:deploy |
例如設(shè)置不同的packaging類型:在 pom.xml 文件中,packaging 類型支持 jar, war, ear, pom 等多種類型,不同的 packaging 類型會使得不同的 phase 綁定不同的 plugin goal。下面是 packaging 類型為 jar 時,phase 與 plugin goal 的映射關(guān)系。
| 階段 | 目標(biāo) |
|---|---|
| process-resources | resources:resources |
| compile | compiler:compile |
| process-test-resources | resources:testResources |
| test-compile | compiler:testCompile |
| test | surefire:test |
| package | jar:jar |
| install | install:install |
| deploy | deploy:deploy |
配置插件
在 pom.xml 文件中, <build> <plugins> 元素下可以添加 <plugin>,通過指定 goal 和 phase 來進(jìn)行綁定。
例如:將插件 modello-maven-plugin 的 java 目標(biāo)綁定到 generate-sources 階段。
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.8.1</version>
<executions>
<execution>
<configuration>
<models>
<model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
</configuration>
<phase>generate-sources</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
</plugin>
沒有配置任何插件的情況下,maven會使用自己默認(rèn)的配置插件:
沒有配置任何 plugin 的 pom.xml,執(zhí)行 mvn install 的輸出日志,從日志中可以看到 一系列的 插件(plugin):版本號:目標(biāo)(phase),例如
maven-resources-plugin:2.6:resources (default-resources),maven-compiler-plugin:3.1:compile (default-compile) ,
maven-resources-plugin:2.6:testResources (default-testResources),maven-compiler-plugin:3.1:testCompile (default-testCompile),
maven-surefire-plugin:2.12.4:test (default-test),
maven-jar-plugin:2.4:jar (default-jar) ,
maven-install-plugin:2.4:install (default-install)。