Maven實戰讀書筆記(四):Maven生命週期與插件

Maven的生命週期是對全部構建過程的抽象和統一。包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎全部構建步驟。算法

Maven的生命週期是抽象的,其實際行爲是由插件來完成的,生命週期和插件二者協同合做,密不可分。apache

這種思想與設計模式中的模板方法很是類似。模板方法模式在父類定義算法的總體結構,子類經過實現或者重寫父類的方法來控制實際行爲,這樣既能保證算法有足夠的可擴展性,又能嚴格控制算法的總體結構。設計模式

4.1 生命週期

Maven擁有3套獨立的生命週期:cleandefaultsite服務器

clean生命週期的目的是清理項目。框架

default生命週期的目的是構建項目。maven

site生命週期的目的是創建項目站點。post

每一個生命週期包含一些階段(phase),這些階段是有序的,後面的階段會依賴於前面的階段。單元測試

4.1.1 clean生命週期

clean生命週期的3個階段:測試

1) pre-clean:執行一些清理前須要完成的動做spa

2) clean:清理上一次構建生成的文件

3) post-clean:執行一些清理後須要完成的動做

4.1.2 default生命週期:

1) validate

2) initialize

3) generate-sources

4) process-sources 處理項目主資源文件,通常來講,是對src/main/resources目錄的內容進行變量替換等工做,複製到項目輸出的主classpath目錄中。

5) generate-resources

6) process-resources

7) compile 編譯項目的主源碼到主classpath目錄中。

8) process-classes

9) generate-test-sources

10) process-test-sources 處理項目測試資源文件,通常來講,是對src/test/resources目錄的內容進行變量替換等工做,複製到項目輸出的測試classpath目錄中。

11)generate-test-resources

12)process-test-resources

13) test-compile編譯項目的測試源碼到測試classpath目錄中。

14) process-test-classes

15)test使用單元測試框架進行測試,測試代碼不會被打包或部署

16) prepare-package

17) package 將編譯好的代碼,打包成可發佈的格式,如jar

18) pre-integration-test

19)integration-test

20) post-integration-test

21) verify

22)install 將包安裝到Maven本地倉庫,供本地其餘Maven項目使用

23) deploy 將最終的包複製到遠程倉庫,供其餘開發人員和Maven項目使用

4.1.3 site生命週期

site生命週期的目的是創建和發佈項目站點,Maven可以基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息,含以下階段:

1)pre-site執行一些在生成項目站點以前須要完成的工做

2)site 生成項目站點文檔

3) post-site執行一些在生成項目站點以後須要完成的工做

4) site-deploy 將生成的項目站點發布到服務器上

4.2 插件目標

對於一個插件,爲了複用代碼,它每每可以完成多個任務,例如maven-dependency-plugin,可以分析項目依賴;列出項目依賴樹;列出項目已解析的依賴,爲這樣每一個功能獨立編寫一個插件,顯然是不可取的,由於這些功能背後有相同的代碼,所以將這些功能彙集在一個插件裏,每一個功能就是一個插件目標。

4.3 插件綁定

Maven的生命週期與插件相互綁定,用於完成實際的構建任務,具體而言,是生命週期的階段與插件的目標相互綁定,以完成某個具體的構建任務。

下面是一些內置的綁定:

clean生命週期

maven-clean-plugin只有一個clean目標

site生命週期

項目的打包類型會影響構建的具體過程,所以default生命週期的階段與插件目標的綁定關係由項目的打包類型所決定,下面以jar爲示例:

default生命週期

除了內置綁定外,用戶可以本身選擇將某個插件目標綁定到生命週期的某個階段上,以便在項目構建過程當中執行更豐富的任務。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-source-plugin</artifactId>
   <version>2.1.1</version>
   <executions>
     <execution>
       <id>attach-source</id>
       <phase>verify</phase>
       <goals>
         <goal>jar-no-fork</goal>
       </goals>
     </execution>
   </executions>
</plugin>

除了基本的插件座標配置,<executions>下的每一個<execution>用來配置執行一個任務。有時候,即便不配置<phase>階段,插件目標也能綁定到生命週期中去,這是由於不少插件的目標在編寫時已經定義了默認的綁定階段,能夠經過maven-help-plugin查看插件的詳細信息:
mvn help:describe –Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail

4.4 插件解析機制

爲了方便用戶使用和配置插件,Maven不須要用戶提供完整的插件座標信息,就能夠解析獲得正確的插件。

與依賴構件同樣,插件構件一樣基於座標存儲在Maven倉庫中,但Maven會區別對待依賴的遠程倉庫與插件的遠程倉庫。

經過<repositories>及其子元素<repository>能夠配置依賴的遠程倉庫,插件的遠程倉庫須要使用<pluginRepositories><pluginRepository>進行配置。

默認狀況下,若是該插件是Maven官方插件,則能夠省略groupId(org.apache.maven.plugins),Maven在解析該插件的時候,會自動將groupId補上。

當插件沒有添加版本號時,若該插件是核心插件,則在超級POM已經定義了版本號,若不是核心插件,Maven會遍歷本地倉庫和遠程倉庫,計算出latestrelease的值,Maven 2使用latest,但由於latest多是快照版本,Maven 3更改成使用release

相關文章
相關標籤/搜索