架構師工具箱(二)Maven——全面理解Maven的Lifecycle,phase,Goal

寫在前面:

  •     你好,歡迎關注!
  •     我熱愛技術,熱愛分享,熱愛生活, 我始終相信:技術是開源的,知識是共享的!
  •     博客裏面的內容大部分均爲原創,是自己日常的學習記錄和總結,便於自己在後面的時間裏回顧,當然也是希望可以分享 自己的知識。如果你覺得還可以的話不妨關注一下,我們共同進步!
  •     個人除了分享博客之外,也喜歡看書,寫一點日常雜文和心情分享,如果你感興趣,也可以關注關注!
  •     公衆號:傲驕鹿先生

目錄

一、Maven的lifecycle

二、使用構建生命週期來完成構建工作

三、階段(phase)與插件(plugins)的的關係

四、爲自己的工程創建構建生命週期


一、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中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章