maven系列-(四)maven生命週期和外掛
前面講了maven的依賴和倉庫,這是經常接觸到的一些操作。但是我們平時還會接觸到maven生命週期的一些操作,比如打包、編譯等,maven就可以把我們的專案進行打包、編譯。其實這個過程,還是涉及到很多知識點的,只不過我們在操作過程中察覺不到而已。
我們在專案開發中都會涉及到清理、編譯、測試、部署等流程,所以maven就對我們這個過程進行抽象和統一,定義了一套統一的生命週期。
maven的生命週期
maven有三套生命週期,分別是clean、default、site。
clean是用來清理專案,default是構建專案,屬於maven生命週期中最核心的部分,site是建立專案站點。每套生命週期還包含很多階段,階段之間是有順序的。
clean生命週期包含的階段:
順序 | 階段 | 備註 |
---|---|---|
1 | pre-clean | 清理前的準備工作 |
2 | clean | 清理上次構建生成的檔案 |
3 | post-clean | 清理後的工作 |
default生命週期包含的階段:
順序 | 階段 | 備註 |
---|---|---|
1 | validate | 驗證 |
2 | initialize | 初始化構建狀態 |
3 | generate-sources | 生成原始碼 |
4 | process-sources | 處理專案主資原始檔 |
5 | generate-resources | 生成專案中的資源 |
6 | process-resources | 處理資源並複製資源到目標目錄,為打包做準備 |
7 | compile | 編譯專案主原始碼 |
8 | process-classes | 處理生成後的位元組碼檔案 |
9 | generate-test-sources | 生成測試原始碼 |
10 | process-test-sources | 處理專案測試資原始檔 |
11 | generate-test-resources | 建立測試資源 |
12 | process-test-resources | 處理測試資源,並複製到測試目標目錄中 |
13 | test-compile | 編譯測試程式碼 |
15 | process-test-classes | 處理生成後的測試原始碼的位元組碼 |
16 | test | 執行單元測試 |
17 | prepare-package | 打包之前進行一些操作,例如解壓縮,處理版本。 |
18 | package | 打包 |
19 | pre-integration-test | 在整合測試之前進行一些操作 |
20 | integration-test | 整合測試 |
21 | post-integration-test | 執行整合測試後執行所需的操作 |
22 | verify | 檢查 |
23 | install | 將包安裝到maven本地倉庫 |
24 | deploy | 將包複製到遠端倉庫 |
site生命週期包含的階段:
順序 | 階段 | 備註 |
---|---|---|
1 | pre-site | 生成站點前準備工作 |
2 | site | 生成專案站點文件 |
3 | post-site | 生成站點之後的工作 |
4 | site-deploy | 將生成的站點發布到伺服器上 |
maven外掛
maven定義了生命週期,但是並沒有具體的實現,maven定義的生命週期是抽象的,所有的實現都交由外掛完成。這就在保證嚴格控制生命週期流程的條件下,實現了足夠的擴充套件性。
maven外掛為了能夠達到複用,一個外掛一般都可以完成多個功能,每個功能就是一個外掛目標。
上面maven生命週期表格中的步驟,一個步驟都可以繫結一個或多個外掛行為,並且為了方便起見,maven為大多數步驟都編寫並綁定了預設的外掛,這就是內建繫結,為了讓使用者不做任何配置就可以構建maven專案。除了內建繫結之外,使用者還可以自己選擇將某個外掛目標繫結到maven某個生命週期的某個階段,這就是自定義繫結,可以讓maven專案在構建過程中執行更多自定義的任務。
下面是內建繫結中,常見的生命週期階段和外掛目標的對應關係:
(由於打包型別不同,外掛也不同,這裡以打包型別為jar舉例)
生命週期階段 | 外掛目標 | 說明 |
---|---|---|
clean | maven-clean-plugin:clean | 清理上次構建生成的檔案 |
process-resources | maven-resources-plugin:resources | 複製主資原始檔至主輸出目錄 |
compile | maven-compiler-plugin:compile | 編譯主程式碼至主輸出目錄 |
process-test-resources | maven-resources-plugin:testResources | 複製測試資原始檔至測試輸出目錄 |
test-compile | maven-compiler-plugin:testCompile | 編譯測試程式碼至測試輸出目錄 |
test | maven-surefire-plugin:test | 執行測試用例 |
package | maven-jar-plugin:jar | 建立jar包 |
install | maven-install-plugin:install | 將專案輸出構件安裝到本地倉庫 |
deploy | maven-deploy-plugin:deploy | 將專案輸出構件部署到遠端倉庫 |
site | maven-site-plugin:site | 編譯測試程式碼至測試輸出目錄 |
site-deploy | maven-site-plugin:deploy | 編譯測試程式碼至測試輸出目錄 |
除了內建繫結,使用者還可以進行自定義繫結,我們有時候可以在pom檔案中看到如下的配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.3</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
這段配置,就是自定義繫結,這裡定義了使用maven-source-plugin外掛,executions下每個execution子元素可以配置一個任務,phase定義為compile生命週期,goal指定目標是jar,也就是maven-source-plugin外掛的jar目標。所以,當通過maven執行compile生命週期時,就是執行maven-source-plugin外掛的jar目標。
外掛倉庫
maven在解析外掛時,也是先從本地倉庫尋找,如果找不到,再去遠端倉庫尋找,但是外掛的遠端倉庫有點特殊,和我們之前配置的依賴的遠端倉庫的地址不是同一個地址。
有時候,我們可能會在pom檔案看到如下配置:
<pluginRepositories>
<pluginRepository>
<id>xxx-nexus</id>
<url>http://maven.xxx.com:8081/nexus/content/xxx/xxx</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
這段配置就是配置maven外掛的遠端倉庫地址的,maven也有內建的外掛遠端倉庫的地址,一般情況下,內建的外掛遠端倉庫地址就可以滿足大部分的場景了,所以自定義的外掛遠端倉庫一般不會看到。
pom中配置外掛時,如果這個外掛是maven官方外掛,則可以省略groupId的配置,但是一般不推薦這麼使用。
參考資料:
1.《maven實戰》 許曉斌 著