1. 程式人生 > >Maven:生命週期。

Maven:生命週期。

三套生命週期

初學者往往會以為Maven的生命週期是一個整體,其實不然,Maven擁有三套相互獨立的生命週期,他們分別為clean、default和site。clean生命週期的目的是清理專案,default生命週期的目的是構建專案,而site生命週期的目的是建立專案站點。

每個生命週期包含一些階段(phase),這些階段是有順序的,並且後面的階段依賴於前面的階段,使用者和Maven最直接的互動方式就是呼叫這些生命週期階段。以clean生命週期為例,他包含的階段有pre-clean、clean和post-clean。當用戶呼叫pre-clean的時候,只有pre-clean階段得以執行;當用戶呼叫clean的時候,pre-clean和clean階段會得以順序執行;當用戶呼叫post-clean的時候,pre-clean、clean和post-clean會得以順序執行。

較之於生命週期階段的前後依賴關係,三套生命週期本身是相互獨立的,使用者可以僅僅呼叫clean生命週期的某個階段,或者僅僅呼叫default生命週期的某個階段,而不會對其他生命週期產生任何影響。例如,當用戶呼叫clean生命週期的clean階段的時候,不會觸發default生命週期的任何階段,反之亦然,當用戶呼叫default生命週期的compile階段的時候,也不會觸發clean生命週期的任何階段。

clean生命週期

clean生命週期的目的是清理專案,他包含三個階段:

  1. pre-clean執行一些清理前需要完成的工作。
  2. clean清理上一次構建生成的檔案。
  3. post-clean執行一些清理後需要完成的工作。

default生命週期

default生命週期定義了真正構建所需要執行的所有步驟,他是所有生命週期中最核心的部分,其包含的階段如下,這裡只對重要的階段進行解釋:

  • validate
  • initialize
  • generate-sources
  • process-sources 處理專案主資原始檔。一般來說,是對src/main/resources 目錄的內容進行變數替換等工作後,複製到專案輸出的主classpath目錄中。
  • generate-sources
  • process-sources
  • compile 編譯專案的主原始碼。一般來說,是編譯 src/main/java目錄下的Java檔案至專案輸出的主classpath目錄中。
  • process-sources
  • generate-test-sources
  • process-test-sources 處理專案測試資原始檔。一般來說,是對src/test/resources 目錄的內容進行變數替換等工作後,複製到專案輸出的主classpath目錄中。
  • generate-test-sources
  • process-test-sources
  • test-compile 編譯專案的測試程式碼。一般來說,是編譯src/test/java 目錄下的Java檔案至專案輸出的測試classpath目錄中。
  • process-test-sources
  • test 使用單元測試框架執行測試,測試程式碼不會被打包或部署。
  • prepare-package
  • package 接受編譯好的程式碼,打包成可釋出的格式,如JAR。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 將包裝到Maven本地倉庫,供本地其他Maven專案使用。
  • deploy將最終的包複製到遠端倉庫,供其他開發人員和Maven專案使用。

對於上述未加解釋的階段,應該能夠根據名字大概猜到其用途。

site生命週期

site生命週期的目的是建立和釋出專案站點,Maven能夠基於POM所包含的資訊,自動生成一個友好的站點,方便團隊交流和釋出專案資訊。該生命週期包含如下階段:

  • pre-site 執行一些在生成專案站點之前需要完成的工作。
  • site 生成專案站點文件。
  • post-site 執行一些在生成專案站點之後需要完成的工作。
  • site-deploy將生成的專案站點發布到伺服器上。

命令列與生命週期

從命令列執行Maven任務的最主要方式就是呼叫Maven的生命週期階段。需要注意的是,各個生命週期是專案獨立的,而一個生命週期的階段是有前後依賴關係的。下面以一些常見的Maven命令為例,解釋其執行的生命週期階段:

  • $mvn clean:該命令呼叫clean生命週期的clean階段。實際執行的階段為clean生命週期的pre-clean和clean階段。
  • $mvn test:該命令呼叫default生命週期的test階段。實際執行的階段為default生命週期的validate、initialize等,直到test的所有階段。這也解釋了為什麼在執行測試的時候,專案的程式碼能夠自動得以編譯。
  • $mvn clean install:該命令呼叫clean生命週期的clean階段和default生命週期的install階段。實際執行的階段為clean生命週期的pre-clean、clean階段,以及default生命週期的從validate至install的所有階段。該命令結合了Maven兩個個生命週期,在執行真正的專案構建之前清理專案是一個很好的實踐。
  • $mvn clean deploy site-deploy:該命令呼叫clean生命週期的clean階段、default生命週期的deploy階段,以及site生命週期的site-deploy階段。實際執行的階段為clean生命週期的pre-clean、clean階段,default生命週期的所有階段,以及site生命週期的所有階段。該命令結合了Maven所有三個生命週期,且deploy為default生命週期的最後一個階段,site-deploy為site生命週期的最後一個階段。

由於Maven中主要的生命週期階段並不多,而常用的Maven命令實際都是基於這些階段簡單組合而成的,因此只要對Maven生命週期有一個基本的理解。就可以正確而熟練的使用Maven命令。