網頁

2018/9/16

Maven 專案建置的生命週期 (Maven build lifecycle)

學習Maven最重要的觀念就是要知道什麼是Maven的建置生命週期(Build Lifecycle)。因為Maven就是以此為基礎來運行。或是說,你要先知道什麼一般專案build的過程是什麼。

Maven定義了三種基本的build lifecycle(定義在maven-core.jar的META-INF/plexus/components.xml中),分別為

  1. clean : 移除之前建置(build)所產生的檔案。
  2. default : 專案程式的驗證,編譯,測試,打包,確效,存檔,安裝,佈署。
  3. site : 產生專案的網站文件,例如專案資訊,測試報告等。

而每一種lifecycle又由數個phases(階段)組成,例如default包含了下列主要的phases。

  1. validate(驗證) : 驗證專案所需的資訊是否正確。
  2. compile(編譯) : 編譯原始碼。
  3. test(測試) : 對編譯的程式碼進行單元測試(unit test)。
  4. package(打包) : 將編譯的程式碼打包成指定的檔案格式,例如jar或war。
  5. verify(確效) : 進行整合測試。
  6. install(安裝) : 將打包好的檔案安裝(存入)至本地端的儲存庫(local repository)。
  7. deploy(佈署) : 將打包好的檔案上傳至遠端的儲存庫(remote repository)。

每個phase會由上而下依序執行。此為Maven內建的執行順序,因為Maven本身是依慣例優於配置(convention over configuration)的設計,而這順序為Maven對專案建置的最佳實踐(best practice),也因此你不用自己去安排建置專案的每個步驟的執行順序或該做些什麼。

還有很重要的一點,例如你執行的phase為install,則Maven會從第一個phase,也就是validate開始執行,接著依序往下執行compiletestpackageverify直到install執行結束,也就是說指定執行phase之前的phases都會被執行。

上面僅列出default生命週期中幾個重要的phases的,詳細請參考Maven的Lifecycle Reference

從這裡我才理解為什麼每次執行package連前面的phase都會被執行,因為Maven設計就是如此。


接著請參考plugingoalphase的關係


最後說點廢話,從我踏入軟體業工作開始到現在三年的時間內,身邊絕大多數的程式設計師(包括我自己,還有些資歷5年以上的資深工程師)對於Maven的認識都仍僅限於依賴函式庫的使用,也就是只會用pom.xml<dependency>來匯入需要的函式庫,而對於Maven如何用來建置部屬專案則毫無概念,或不知如何設定或使用。
原因可能是以前舊專案根本不寫單元測試或使用整合測試工具,都是工程師自己人工手測過了就提交了,也沒有自動發佈的概念,還是人工checkout下來打包成war檔丟給客戶,然後也不要求壓測或弱點掃描之類的。也有可能是我還在碼農的層級,所以身邊的多數也都是碼農(?)。

而我本身其實在入行半年當時就試著想了解pom.xml中除了<dependency>外其他tag代表了什麼意思,不過我記得當時google了幾篇Maven教學文章覺得跟天書一樣。直到現在從工作中稍微理解了專案開發的過程後,現在回來看Maven才有種恍然大悟的感覺。而其中build lifecycle則是我覺得最重要觀念。不僅限於Maven,而是所有的專案幾乎都是走這流程,但對資質駑鈍如我若沒有人仔細解釋說明還真不清楚。

最近會開始著重在Maven的學習原因包括:

  • 現在都會要求CI/CD(持續整合,持續發佈),Jenkins通常會搭配Maven來實作。
  • 幾乎所有的專案都使用Maven,僅管大部份只是拿來匯入函式庫。
  • 你要往資深的道路前進,勢必要懂得如何利用Maven切割模組。
  • pom.xml裡面那些tag到底是代表什麼意思?

簡單說就是想搞清楚是怎麼一回事,要不然每次都按照別人給的Maven指令或步驟去執行,console印出一堆訊息,但不知所以然。


參考:

沒有留言:

張貼留言