Maven - 構建生命周期

什么是構建生命周期

階段 處理 描述
準備資源 資源復制 資源復制可以進行定制
編譯 compile 執行編譯 源代碼編譯在此階段完成
包裝 package 打包 創建JAR/WAR包如在 pom.xml 中定義提及的包
安裝 install 安裝 這一階段在本地/遠程Maven倉庫安裝程序包

Maven的構建過程被分解為構建生命周期、階段和目標。一個構建周期由一系列的構建階段組成,每一個構建階段由一系列的目標組成。當你運行Maven的時候,你會傳入一條命令。這條命令就是構建生命周期、階段或目標的名字。如果執行一個生命周期,該生命周期內的所有構建階段都會被執行。如果執行一個構建階段,在預定義的構建階段中,所有處于當前構建階段之前的階段也都會被執行。
一個典型的 Maven 構建生命周期是由下列順序的階段:

階段 處理 描述
準備資源 資源復制 資源復制可以進行定制
編譯 compile 執行編譯 源代碼編譯在此階段完成
包裝 package 打包 創建JAR/WAR包如在 pom.xml 中定義提及的包
安裝 install 安裝 這一階段在本地/遠程Maven倉庫安裝程序包

Maven 的內部有三個構建生命周期,分別是 clean, default, site。其中 default 生命周期包含有23個階段,其核心階段如下所示:

生命周期階段 描述
validate 檢查工程配置是否正確,完成構建過程的所有必要信息是否能夠獲取到。
compile 編譯工程源碼。
test 使用適當的單元測試框架(例如JUnit)運行測試。
package 獲取編譯后的代碼,并按照可發布的格式進行打包,例如 JAR、WAR 或者 EAR 文件。
verify 運行檢查操作來驗證工程包是有效的,并滿足質量要求。
install 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴。
deploy 拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程。
生命周期主要階段
生命周期階段 描述
validate 檢查工程配置是否正確,完成構建過程的所有必要信息是否能夠獲取到。
compile 編譯工程源碼。
test 使用適當的單元測試框架(例如JUnit)運行測試。
package 獲取編譯后的代碼,并按照可發布的格式進行打包,例如 JAR、WAR 或者 EAR 文件。
verify 運行檢查操作來驗證工程包是有效的,并滿足質量要求。
install 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴。
deploy 拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程。

當一個階段通過 Maven 命令調用時,例如 mvn compile,只有該階段之前以及包括該階段在內的所有階段會被執行。
不同的 maven 目標將根據打包的類型(JAR / WAR / EAR),被綁定到不同的 Maven 生命周期階段。
可以指定多個不同構建生命周期的階段,執行 mvn clean deploy 命令,首先完成的 clean lifecycle,將以前構建的文件清理,然后再執行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 階段,將 package 階段創建的包發布到遠程倉庫中。

階段與插件的關系

Maven 將構建過程定義為 default lifecycle,并將 default lifecycle 劃分為一個個的階段 phase,這一系列 phase 僅僅是規定執行順序,每個階段做什么工作?有誰來做,是由插件(plugins)來處理的。
一個插件可以支持多種功能,稱之為目標(goal),例如:compiler 插件有兩個目標:compile 和 testCompile,分別實現編譯源代碼 和 編譯測試代碼。
通過將插件的目標(goal)與 build lifecycle 中 phase 綁定到一起,這樣,當要執行某個 phase 時,就調用插件來完成綁定的目標。
從圖中可以看出,每一個階段可以綁定0 個 或 多個目標,每個插件可以提供 1 個或多個目標。

階段與插件關系圖

如何為工程創建構建生命周期

階段 目標
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

例如設置不同的packaging類型:在 pom.xml 文件中,packaging 類型支持 jar, war, ear, pom 等多種類型,不同的 packaging 類型會使得不同的 phase 綁定不同的 plugin goal。下面是 packaging 類型為 jar 時,phase 與 plugin goal 的映射關系。

階段 目標
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 來進行綁定。
例如:將插件 modello-maven-plugin 的 java 目標綁定到 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會使用自己默認的配置插件:
沒有配置任何 plugin 的 pom.xml,執行 mvn install 的輸出日志,從日志中可以看到 一系列的 插件(plugin):版本號:目標(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)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 所有項目的構建都是有生命周期的,這個生命周期包括:項目清理、初始化、編譯、測試、打包、集成測試、驗證、部署、站點生...
    zlcook閱讀 2,809評論 0 21
  • 什么是構建生命周期 構建生命周期是一組階段的序列(sequence of phases),每個階段定義了目標被執行...
    小孩真笨閱讀 279評論 0 0
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 1. Maven 構建生命周期 Maven 構建生命周期就是 Maven 將一個整體任務劃分為一個個的階段,類似于...
    data4閱讀 31,082評論 3 35
  • 各位婊貝兒好久不賤,我是詩兄,今天這么哇塞的天氣最適合出來浪了~ 為毛微信朋友圈總是混進一些奇怪的動西? 如果不出...
    詩與胡說官微閱讀 459評論 0 0