Maven 構建生命週期之Spring Cloud直播商城 b2b2c電子商務技術總結

JIAN2發表於2022-07-18

Maven 構建生命週期

Maven 構建生命週期定義了一個專案構建跟釋出的過程。

一個典型的 Maven 構建(build)生命週期是由以下幾個階段的序列組成的:

Maven 構建生命週期之Spring Cloud直播商城 b2b2c電子商務技術總結

階段 處理 描述
驗證 validate 驗證專案 驗證專案是否正確且所有必須資訊是可用的
編譯 compile 執行編譯 原始碼編譯在此階段完成
測試 Test 測試 使用適當的單元測試框架(例如JUnit)執行測試。
包裝 package 打包 建立JAR/WAR包如在 pom.xml 中定義提及的包
檢查 verify 檢查 對整合測試的結果進行檢查,以保證質量達標
安裝 install 安裝 安裝打包的專案到本地倉庫,以供其他專案使用
部署 deploy 部署 拷貝最終的工程包到遠端倉庫中,以共享給其他開發人員和工程

為了完成 default 生命週期,這些階段(包括其他未在上面羅列的生命週期階段)將被按順序地執行。

Maven 有以下三個標準的生命週期:

  • clean:專案清理的處理
  • default(或 build):專案部署的處理
  • site:專案站點文件建立的處理

構建階段由外掛目標構成

一個外掛目標代表一個特定的任務(比構建階段更為精細),這有助於專案的構建和管理。這些目標可能被繫結到多個階段或者無繫結。不繫結到任何構建階段的目標可以在構建生命週期之外通過直接呼叫執行。這些目標的執行順序取決於呼叫目標和構建階段的順序。

例如,考慮下面的命令:

clean 和 pakage 是構建階段,dependency:copy-dependencies 是目標

mvn clean dependency:copy-dependencies package

這裡的 clean 階段將會被首先執行,然後 dependency:copy-dependencies 目標會被執行,最終 package 階段被執行。


Clean 生命週期

當我們執行 mvn post-clean 命令時,Maven 呼叫 clean 生命週期,它包含以下階段:

  • pre-clean:執行一些需要在clean之前完成的工作
  • clean:移除所有上一次構建生成的檔案
  • post-clean:執行一些需要在clean之後立刻完成的工作

mvn clean 中的 clean 就是上面的 clean,在一個生命週期中,執行某個階段的時候,它之前的所有階段都會被執行,也就是說,如果執行 mvn clean 將執行以下兩個生命週期階段:

pre-clean, clean

如果我們執行 mvn post-clean ,則執行以下三個生命週期階段:

pre-clean, clean, post-clean

我們可以通過在上面的 clean 生命週期的任何階段定義目標來修改這部分的操作行為。

在下面的例子中,我們將 maven-antrun-plugin:run 目標新增到 pre-clean、clean 和 post-clean 階段中。這樣我們可以在 clean 生命週期的各個階段顯示文字資訊。

我們已經在 C:\MVN\project 目錄下建立了一個 pom.xml 檔案。

< project xmlns = " "   xmlns:xsi = " "   xsi:schemaLocation = "   " > < modelVersion > 4.0.0 </ modelVersion > < groupId > com.companyname.projectgroup </ groupId > < artifactId > project </ artifactId > < version > 1.0 </ version > < build > < plugins >   < plugin >   < groupId > org.apache.maven.plugins </ groupId >   < artifactId > maven-antrun-plugin </ artifactId >   < version > 1.1 </ version >   < executions >       < execution >         < id > id.pre-clean </ id >         < phase > pre-clean </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > pre-clean phase </ echo >             </ tasks >         </ configuration >       </ execution >       < execution >         < id > id.clean </ id >         < phase > clean </ phase >         < goals >           < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > clean phase </ echo >             </ tasks >         </ configuration >       </ execution >       < execution >         < id > id.post-clean </ id >         < phase > post-clean </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > post-clean phase </ echo >             </ tasks >         </ configuration >       </ execution >   </ executions >   </ plugin > </ plugins > </ build > </ project >

現在開啟命令控制檯,跳轉到 pom.xml 所在目錄,並執行下面的 mvn 命令。

C:\MVN\project>mvn post-clean

Maven 將會開始處理並顯示 clean 生命週期的所有階段。

[INFO] Scanning for projects...[INFO] ------------------------------------------------------------------[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0[INFO]    task-segment: [post-clean][INFO] ------------------------------------------------------------------[INFO] [antrun:run {execution: id.pre-clean}][INFO] Executing tasks     [echo] pre-clean phase[INFO] Executed tasks[INFO] [clean:clean {execution: default-clean}][INFO] [antrun:run {execution: id.clean}][INFO] Executing tasks     [echo] clean phase[INFO] Executed tasks[INFO] [antrun:run {execution: id.post-clean}][INFO] Executing tasks     [echo] post-clean phase[INFO] Executed tasks[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------[INFO] Total time: < 1 second[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012[INFO] Final Memory: 4M/44M[INFO] ------------------------------------------------------------------

你可以嘗試修改 mvn clean 命令,來顯示 pre-clean 和 clean,而在 post-clean 階段不執行任何操作。


Default (Build) 生命週期

這是 Maven 的主要生命週期,被用於構建應用,包括下面的 23 個階段:

生命週期階段 描述
validate(校驗) 校驗專案是否正確並且所有必要的資訊可以完成專案的構建過程。
initialize(初始化) 初始化構建狀態,比如設定屬性值。
generate-sources(生成原始碼) 生成包含在編譯階段中的任何原始碼。
process-sources(處理原始碼) 處理原始碼,比如說,過濾任意值。
generate-resources(生成資原始檔) 生成將會包含在專案包中的資原始檔。
process-resources (處理資原始檔) 複製和處理資源到目標目錄,為打包階段最好準備。
compile(編譯) 編譯專案的原始碼。
process-classes(處理類檔案) 處理編譯生成的檔案,比如說對Java class檔案做位元組碼改善優化。
generate-test-sources(生成測試原始碼) 生成包含在編譯階段中的任何測試原始碼。
process-test-sources(處理測試原始碼) 處理測試原始碼,比如說,過濾任意值。
generate-test-resources(生成測試資原始檔) 為測試建立資原始檔。
process-test-resources(處理測試資原始檔) 複製和處理測試資源到目標目錄。
test-compile(編譯測試原始碼) 編譯測試原始碼到測試目標目錄.
process-test-classes(處理測試類檔案) 處理測試原始碼編譯生成的檔案。
test(測試) 使用合適的單元測試框架執行測試(Juint是其中之一)。
prepare-package(準備打包) 在實際打包之前,執行任何的必要的操作為打包做準備。
package(打包) 將編譯後的程式碼打包成可分發格式的檔案,比如JAR、WAR或者EAR檔案。
pre-integration-test(整合測試前) 在執行整合測試前進行必要的動作。比如說,搭建需要的環境。
integration-test(整合測試) 處理和部署專案到可以執行整合測試環境中。
post-integration-test(整合測試後) 在執行整合測試完成後進行必要的動作。比如說,清理整合測試環境。
verify (驗證) 執行任意的檢查來驗證專案包有效且達到質量標準。
install(安裝) 安裝專案包到本地倉庫,這樣專案包可以用作其他本地專案的依賴。
deploy(部署) 將最終的專案包複製到遠端倉庫中與其他開發者和專案共享。

有一些與 Maven 生命週期相關的重要概念需要說明:

當一個階段通過 Maven 命令呼叫時,例如 mvn compile,只有該階段之前以及包括該階段在內的所有階段會被執行。

不同的 maven 目標將根據打包的型別(JAR / WAR / EAR),被繫結到不同的 Maven 生命週期階段。

在下面的例子中,我們將 maven-antrun-plugin:run 目標新增到 Build 生命週期的一部分階段中。這樣我們可以顯示生命週期的文字資訊。

我們已經更新了 C:\MVN\project 目錄下的 pom.xml 檔案。

< project xmlns = " "   xmlns:xsi = " "   xsi:schemaLocation = "   " > < modelVersion > 4.0.0 </ modelVersion > < groupId > com.companyname.projectgroup </ groupId > < artifactId > project </ artifactId > < version > 1.0 </ version > < build > < plugins > < plugin > < groupId > org.apache.maven.plugins </ groupId > < artifactId > maven-antrun-plugin </ artifactId > < version > 1.1 </ version > < executions >   < execution >       < id > id.validate </ id >       < phase > validate </ phase >       < goals >         < goal > run </ goal >       </ goals >       < configuration >         < tasks >             < echo > validate phase </ echo >         </ tasks >       </ configuration >   </ execution >   < execution >       < id > id.compile </ id >       < phase > compile </ phase >       < goals >         < goal > run </ goal >       </ goals >       < configuration >         < tasks >             < echo > compile phase </ echo >         </ tasks >       </ configuration >   </ execution >   < execution >       < id > id.test </ id >       < phase > test </ phase >       < goals >         < goal > run </ goal >       </ goals >       < configuration >         < tasks >             < echo > test phase </ echo >         </ tasks >       </ configuration >   </ execution >   < execution >         < id > id.package </ id >         < phase > package </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >         < tasks >             < echo > package phase </ echo >         </ tasks >       </ configuration >   </ execution >   < execution >       < id > id.deploy </ id >       < phase > deploy </ phase >       < goals >         < goal > run </ goal >       </ goals >       < configuration >       < tasks >         < echo > deploy phase </ echo >       </ tasks >       </ configuration >   </ execution > </ executions > </ plugin > </ plugins > </ build > </ project >

現在開啟命令控制檯,跳轉到 pom.xml 所在目錄,並執行以下 mvn 命令。

C:\MVN\project>mvn compile

Maven 將會開始處理並顯示直到編譯階段的構建生命週期的各個階段。

[INFO] Scanning for projects...[INFO] ------------------------------------------------------------------[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0[INFO]    task-segment: [compile][INFO] ------------------------------------------------------------------[INFO] [antrun:run {execution: id.validate}][INFO] Executing tasks     [echo] validate phase[INFO] Executed tasks[INFO] [resources:resources {execution: default-resources}][WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent![INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources[INFO] [compiler:compile {execution: default-compile}][INFO] Nothing to compile - all classes are up to date[INFO] [antrun:run {execution: id.compile}][INFO] Executing tasks     [echo] compile phase[INFO] Executed tasks[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------[INFO] Total time: 2 seconds[INFO] Finished at: Sat Jul 07 20:18:25 IST 2012[INFO] Final Memory: 7M/64M[INFO] ------------------------------------------------------------------

命令列呼叫

在開發環境中,使用下面的命令去構建、安裝工程到本地倉庫

mvn install

這個命令在執行 install 階段前,按順序執行了 default 生命週期的階段 (validate,compile,package,等等),我們只需要呼叫最後一個階段,如這裡是 install。

在構建環境中,使用下面的呼叫來純淨地構建和部署專案到共享倉庫中

mvn clean deploy

這行命令也可以用於多模組的情況下,即包含多個子專案的專案,Maven 會在每一個子專案執行 clean 命令,然後再執行 deploy 命令。


Site 生命週期

Maven Site 外掛一般用來建立新的報告文件、部署站點等。

  • pre-site:執行一些需要在生成站點文件之前完成的工作
  • site:生成專案的站點文件
  • post-site: 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備
  • site-deploy:將生成的站點文件部署到特定的伺服器上

這裡經常用到的是site階段和site-deploy階段,用以生成和釋出Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文件及統計資料自動生成,很好看。 在下面的例子中,我們將 maven-antrun-plugin:run 目標新增到 Site 生命週期的所有階段中。這樣我們可以顯示生命週期的所有文字資訊。

我們已經更新了 C:\MVN\project 目錄下的 pom.xml 檔案。

< project xmlns = " "   xmlns:xsi = " "   xsi:schemaLocation = "   " > < modelVersion > 4.0.0 </ modelVersion > < groupId > com.companyname.projectgroup </ groupId > < artifactId > project </ artifactId > < version > 1.0 </ version > < build > < plugins > < plugin > < groupId > org.apache.maven.plugins </ groupId > < artifactId > maven-antrun-plugin </ artifactId > < version > 1.1 </ version >   < executions >       < execution >         < id > id.pre-site </ id >         < phase > pre-site </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > pre-site phase </ echo >             </ tasks >         </ configuration >       </ execution >       < execution >         < id > id.site </ id >         < phase > site </ phase >         < goals >         < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > site phase </ echo >             </ tasks >         </ configuration >       </ execution >       < execution >         < id > id.post-site </ id >         < phase > post-site </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > post-site phase </ echo >             </ tasks >         </ configuration >       </ execution >       < execution >         < id > id.site-deploy </ id >         < phase > site-deploy </ phase >         < goals >             < goal > run </ goal >         </ goals >         < configuration >             < tasks >               < echo > site-deploy phase </ echo >             </ tasks >         </ configuration >       </ execution >   </ executions > </ plugin > </ plugins > </ build > </ project >

現在開啟命令控制檯,跳轉到 pom.xml 所在目錄,並執行以下 mvn 命令。

C:\MVN\project>mvn site

Maven 將會開始處理並顯示直到 site 階段的 site 生命週期的各個階段。

[INFO] Scanning for projects...[INFO] ------------------------------------------------------------------[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0[INFO]    task-segment: [site][INFO] ------------------------------------------------------------------[INFO] [antrun:run {execution: id.pre-site}][INFO] Executing tasks     [echo] pre-site phase[INFO] Executed tasks[INFO] [site:site {execution: default-site}][INFO] Generating "About" report.[INFO] Generating "Issue Tracking" report.[INFO] Generating "Project Team" report.[INFO] Generating "Dependencies" report.[INFO] Generating "Project Plugins" report.[INFO] Generating "Continuous Integration" report.[INFO] Generating "Source Repository" report.[INFO] Generating "Project License" report.[INFO] Generating "Mailing Lists" report.[INFO] Generating "Plugin Management" report.[INFO] Generating "Project Summary" report.[INFO] [antrun:run {execution: id.site}][INFO] Executing tasks     [echo] site phase[INFO] Executed tasks[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------[INFO] Total time: 3 seconds[INFO] Finished at: Sat Jul 07 15:25:10 IST 2012[INFO] Final Memory: 24M/149M[INFO] ------------------------------------------------------------------```



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006413/viewspace-2906147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章