1. 程式人生 > >maven系列-(四)maven生命週期和外掛

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實戰》 許曉斌 著