什么是構建生命周期
階段 | 處理 | 描述 |
---|---|---|
準備資源 | 資源復制 | 資源復制可以進行定制 |
編譯 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)。