Maven強大的一個重要的原因是它有一個十分完善的生命週期模型(lifecycle),這個生命週期可以從兩方面來理解,第一,顧名思義,運行Maven的每個步驟都由它來定義的,這種預定義的預設行為使得我們使用Maven變得簡單,相比而言,Ant的每個步驟都要你手工去定義。第二,這個模型是一種標準,在不同的項目中,使用Maven的介面是一樣的,這樣就不用去仔細理解每個項目的構建了,一般情況下,mvn clean install 這樣的命令是通用的。我想,一定是吸收了許多項目的經驗,Maven才能定義出如此完善的模型。
Maven有三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命週期看成一個整體,其實不然。這三套生命週期分別是: Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 產生項目報告,網站,發布網站。
我再次強調一下它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來產生網站。當然你也可以直接運行 mvn clean install site 運行所有這三套生命週期。
知道了每套生命週期的大概用途和相互關係以後,來逐個詳細看一下每套生命週期,Clean和Site相對比較簡單,先解釋一下。
每套生命週期都由一組階段(Phase)組成,我們平時在命令列輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有點繞。要知道有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段: pre-clean 執行一些需要在clean之前完成的工作 clean 移除所有上一次構建產生的檔案 post-clean 執行一些需要在clean之後立刻完成的工作
mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,如果我們運行 mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令列的輸入。
下面看一下Site生命週期的各個階段: pre-site 執行一些需要在產生網站文檔之前完成的工作 site 產生項目的網站文檔 post-site 執行一些需要在產生網站文檔之後完成的工作,並且為部署做準備 site-deploy 將產生的網站文檔部署到特定的伺服器上
這裡經常用到的是site階段和site-deploy階段,用以產生和發布Maven網站,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計資料自動產生,很好看。
最後,來看一下Maven的最重要的Default生命週期,絕大部分工作都發生在這個生命週期中,這裡,我只解釋一些比較重要和常用的階段: validate generate-sources process-sources generate-resources process-resources 複製並處理資源檔,至目標目錄,準備打包。 compile 編譯項目的原始碼。 process-classes generate-test-sources process-test-sources
generate-test-resources process-test-resources 複製並處理資源檔,至目標測試目錄。 test-compile 編譯測試原始碼。 process-test-classes test 使用合適的單元測試架構運行測試。這些測試代碼不會被打包或部署。 prepare-package package 接受編譯好的代碼,打包成可發布的格式,如 JAR 。 pre-integration-test integration-test post-integration-test verify install 將包安裝至本地倉庫,以讓其它項目依賴。 deploy 將最終的包複製到遠端倉庫,以讓其它開發人員與項目共用。
基本上,根據名稱我們就能猜出每個階段的用途,關於其它階段的解釋,請參考http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
記住,運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什麼我們運行mvn install 的時候,代碼會被編譯,測試,打包。
此外,Maven的外掛程式機制是完全依賴Maven的生命週期的,因此理解生命週期至關重要,在之後的文章裡,我將會進一步解釋Maven的外掛程式機制。