Maven
的生命週期是對全部構建過程的抽象和統一。包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎全部構建步驟。算法
Maven
的生命週期是抽象的,其實際行爲是由插件來完成的,生命週期和插件二者協同合做,密不可分。apache
這種思想與設計模式中的模板方法很是類似。模板方法模式在父類定義算法的總體結構,子類經過實現或者重寫父類的方法來控制實際行爲,這樣既能保證算法有足夠的可擴展性,又能嚴格控制算法的總體結構。設計模式
Maven
擁有3套獨立的生命週期:clean
、default
、site
。服務器
clean
生命週期的目的是清理項目。框架
default
生命週期的目的是構建項目。maven
site
生命週期的目的是創建項目站點。post
每一個生命週期包含一些階段(phase
),這些階段是有序的,後面的階段會依賴於前面的階段。單元測試
clean
生命週期的3個階段:測試
1) pre-clean
:執行一些清理前須要完成的動做spa
2) clean
:清理上一次構建生成的文件
3) post-clean
:執行一些清理後須要完成的動做
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
項目使用
site
生命週期的目的是創建和發佈項目站點,Maven
可以基於POM
所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息,含以下階段:
1)pre-site
執行一些在生成項目站點以前須要完成的工做
2)site
生成項目站點文檔
3) post-site
執行一些在生成項目站點以後須要完成的工做
4) site-deploy
將生成的項目站點發布到服務器上
對於一個插件,爲了複用代碼,它每每可以完成多個任務,例如maven-dependency-plugin
,可以分析項目依賴;列出項目依賴樹;列出項目已解析的依賴,爲這樣每一個功能獨立編寫一個插件,顯然是不可取的,由於這些功能背後有相同的代碼,所以將這些功能彙集在一個插件裏,每一個功能就是一個插件目標。
Maven
的生命週期與插件相互綁定,用於完成實際的構建任務,具體而言,是生命週期的階段與插件的目標相互綁定,以完成某個具體的構建任務。
下面是一些內置的綁定:
maven-clean-plugin
只有一個clean
目標
項目的打包類型會影響構建的具體過程,所以default
生命週期的階段與插件目標的綁定關係由項目的打包類型所決定,下面以jar
爲示例:
除了內置綁定外,用戶可以本身選擇將某個插件目標綁定到生命週期的某個階段上,以便在項目構建過程當中執行更豐富的任務。
<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
爲了方便用戶使用和配置插件,Maven
不須要用戶提供完整的插件座標信息,就能夠解析獲得正確的插件。
與依賴構件同樣,插件構件一樣基於座標存儲在Maven
倉庫中,但Maven
會區別對待依賴的遠程倉庫與插件的遠程倉庫。
經過<repositories>
及其子元素<repository>
能夠配置依賴的遠程倉庫,插件的遠程倉庫須要使用<pluginRepositories>
和<pluginRepository>
進行配置。
默認狀況下,若是該插件是Maven
官方插件,則能夠省略groupId
(org.apache.maven.plugins
),Maven
在解析該插件的時候,會自動將groupId
補上。
當插件沒有添加版本號時,若該插件是核心插件,則在超級POM
已經定義了版本號,若不是核心插件,Maven
會遍歷本地倉庫和遠程倉庫,計算出latest
和release
的值,Maven 2
使用latest
,但由於latest
多是快照版本,Maven 3
更改成使用release
。