寫在前面:
- 你好,歡迎關注!
- 我熱愛技術,熱愛分享,熱愛生活, 我始終相信:技術是開源的,知識是共享的!
- 博客裏面的內容大部分均爲原創,是自己日常的學習記錄和總結,便於自己在後面的時間裏回顧,當然也是希望可以分享 自己的知識。如果你覺得還可以的話不妨關注一下,我們共同進步!
- 個人除了分享博客之外,也喜歡看書,寫一點日常雜文和心情分享,如果你感興趣,也可以關注關注!
- 公衆號:傲驕鹿先生
目錄
一、Maven的lifecycle
Maven 擁有三套獨立的生命週期,它們分別是 clean、default 和 site。clean 生命週期的目的是清理項目;default 生命週期的目的是構建項目;site 生命週期的目的是建立項目站點。其中deault是最重要的生命週期,擁有validate 、compile 、test 、package 、integration、verify、install、deploy等等階段(phase) 。
每個生命週期又包含了多個階段。這些階段在執行的時候是有固定順序的。後面的階段一定要等前面的階段執行完成後才能被執行。比如 clean 生命週期,它就包含 pre-clean、clean 和 post-clean 三個階段。用戶調用 pre-clean 時,只有 pre-clean 階段被執行;調用 clean 時,先執行 pre-clean,再執行 clean 階段;同理,當調用 post-clean 時,Maven 自動先執行 pre-clean、再執行 clean,最後執行 post-clean。
下面詳細介紹每套生命週期的各個階段。
1. clean 生命週期
clean 生命週期的目的是清理項目,它包括以下三個階段。
- pre-clean:執行清理前需要完成的工作。
- clean:清理上一次構建過程中生成的文件,比如編譯後的 class 文件等。
- post-clean:執行清理後需要完成的工作。
2. default 生命週期
default 生命週期定義了構建項目時所需要的執行步驟,它是所有生命週期中最核心部分,包含的階段如下表所述,比較常用的階段用粗體標記。
3. site 生命週期
site 生命週期的目的是建立和發佈項目站點。Maven 可以基於 pom 所描述的信息自動生成項目的站點,同時還可以根據需要生成相關的報告文檔集成在站點中,方便團隊交流和發佈項目信息。site 生命週期包括如下階段。
- pre-site:執行生成站點前的準備工作。
- site:生成站點文檔。
- post-site:執行生成站點後需要收尾的工作。
- site-deploy:將生成的站點發布到服務器上。
二、使用構建生命週期來完成構建工作
1、可以指定某個生命週期的階段
執行 mvn install 命令,將完成 validate, compile, test, package, verify, install 階段,並將 package 生成的包發佈到本地倉庫中。其中某些帶有連字符的階段不能通過 shell 命令單獨指定。例如:(pre-, post-, or process-*)
mvn install
2、可以指定多個不同構建生命週期的階段
執行 mvn clean deploy 命令,首先完成的 clean lifecycle,將以前構建的文件清理,然後再執行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 階段,將 package 階段創建的包發佈到遠程倉庫中。
mvn clean deploy
三、階段(phase)與插件(plugins)的的關係
default 生命週期定義了構建項目時所需要的執行步驟,它是所有生命週期中最核心部分。
Maven 將構建過程定義爲 default lifecycle,並將 default lifecycle 劃分爲一個個的階段 phase,這一系列 phase 僅僅是規定執行順序,至於每個階段做什麼工作?由誰來做?答案就在 插件(plugins) 中。
Maven 對工程的所有操作實實在在的都是由 插件來完成的。一個插件可以支持多種功能,稱之爲目標(goal),例如:compiler 插件有兩個目標:compile 和 testCompile,分別實現編譯源代碼 和 編譯測試代碼。
如何將插件與 Maven 的構建生命週期綁定在一起呢?通過將插件的目標(goal)與 build lifecycle 中 phase 綁定到一起,這樣,當要執行某個 phase 時,就調用插件來完成綁定的目標。
如下圖所示:從圖中可以看出,每一個階段可以綁定0 個 或 多個目標,每個插件可以提供 1 個或多個目標。
四、爲自己的工程創建構建生命週期
1、設置不同的 packaging 類型
在 pom.xml 文件中,packaging 類型支持 jar, war, ear, pom 等多種類型,不同的 packaging 類型會使得不同的 phase 綁定不同的 plugin goal。下面是 packaging 類型爲 jar 時,phase 與 plugin goal 的映射關係。
2、配置plugin
在 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>
拋開mojo不講,lifecycle與phase與goal就是級別的大小問題,引用必須是從高級引用下級(goal綁定到phase,也可以理解爲phase引用goal,只是在具體綁定時,不會phase定義引用哪些goal,但是執行是,卻是phase調用綁定到它那的goal),也不能跨級引用,如lifecycle可以引用任意的phase,不同lifecycle可以同時引用相同的phase,lifecycle不能跨級引用goal。goal會綁定到任意的phase中,也就是說不同的phase可以同時引用相同的goal,所以goal可以在一個lifecycle裏被重複執行哦,goal自然也不能說綁定到lifecycle中。