Maven 構(gòu)建生命周期定義了一個(gè)項(xiàng)目構(gòu)建跟發(fā)布的過程。
一個(gè)典型的 Maven 構(gòu)建(build)生命周期是由以下幾個(gè)階段的序列組成的:
階段 | 處理 | 描述 |
---|---|---|
驗(yàn)證 validate | 驗(yàn)證項(xiàng)目 | 驗(yàn)證項(xiàng)目是否正確且所有必須信息是可用的 |
編譯 compile | 執(zhí)行編譯 | 源代碼編譯在此階段完成 |
測(cè)試 Test | 測(cè)試 | 使用適當(dāng)?shù)膯卧獪y(cè)試框架(例如JUnit)運(yùn)行測(cè)試。 |
包裝 package | 打包 | 創(chuàng)建JAR/WAR包如在 pom.xml 中定義提及的包 |
檢查 verify | 檢查 | 對(duì)集成測(cè)試的結(jié)果進(jìn)行檢查,以保證質(zhì)量達(dá)標(biāo) |
安裝 install | 安裝 | 安裝打包的項(xiàng)目到本地倉(cāng)庫(kù),以供其他項(xiàng)目使用 |
部署 deploy | 部署 | 拷貝最終的工程包到遠(yuǎn)程倉(cāng)庫(kù)中,以共享給其他開發(fā)人員和工程 |
為了完成 default 生命周期,這些階段(包括其他未在上面羅列的生命周期階段)將被按順序地執(zhí)行。
Maven 有以下三個(gè)標(biāo)準(zhǔn)的生命周期:
clean:項(xiàng)目清理的處理
default(或 build):項(xiàng)目部署的處理
site:項(xiàng)目站點(diǎn)文檔創(chuàng)建的處理
一個(gè)插件目標(biāo)代表一個(gè)特定的任務(wù)(比構(gòu)建階段更為精細(xì)),這有助于項(xiàng)目的構(gòu)建和管理。這些目標(biāo)可能被綁定到多個(gè)階段或者無綁定。不綁定到任何構(gòu)建階段的目標(biāo)可以在構(gòu)建生命周期之外通過直接調(diào)用執(zhí)行。這些目標(biāo)的執(zhí)行順序取決于調(diào)用目標(biāo)和構(gòu)建階段的順序。
例如,考慮下面的命令:
clean 和 pakage 是構(gòu)建階段,dependency:copy-dependencies 是目標(biāo)
mvn clean dependency:copy-dependencies package
這里的 clean 階段將會(huì)被首先執(zhí)行,然后 dependency:copy-dependencies 目標(biāo)會(huì)被執(zhí)行,最終 package 階段被執(zhí)行。
當(dāng)我們執(zhí)行 mvn post-clean 命令時(shí),Maven 調(diào)用 clean 生命周期,它包含以下階段:
pre-clean:執(zhí)行一些需要在clean之前完成的工作
clean:移除所有上一次構(gòu)建生成的文件
post-clean:執(zhí)行一些需要在clean之后立刻完成的工作
mvn clean 中的 clean 就是上面的 clean,在一個(gè)生命周期中,運(yùn)行某個(gè)階段的時(shí)候,它之前的所有階段都會(huì)被運(yùn)行,也就是說,如果執(zhí)行 mvn clean 將運(yùn)行以下兩個(gè)生命周期階段:
pre-clean, clean
如果我們運(yùn)行 mvn post-clean ,則運(yùn)行以下三個(gè)生命周期階段:
pre-clean, clean, post-clean
我們可以通過在上面的 clean 生命周期的任何階段定義目標(biāo)來修改這部分的操作行為。
在下面的實(shí)例中,我們將 maven-antrun-plugin:run 目標(biāo)添加到 pre-clean、clean 和 post-clean 階段中。這樣我們可以在 clean 生命周期的各個(gè)階段顯示文本信息。
我們已經(jīng)在 C:\MVN\project 目錄下創(chuàng)建了一個(gè) pom.xml 文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <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>
現(xiàn)在打開命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行下面的 mvn 命令。
C:\MVN\project>mvn post-clean
Maven 將會(huì)開始處理并顯示 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 階段不執(zhí)行任何操作。
這是 Maven 的主要生命周期,被用于構(gòu)建應(yīng)用,包括下面的 23 個(gè)階段:
生命周期階段 | 描述 |
---|---|
validate(校驗(yàn)) | 校驗(yàn)項(xiàng)目是否正確并且所有必要的信息可以完成項(xiàng)目的構(gòu)建過程。 |
initialize(初始化) | 初始化構(gòu)建狀態(tài),比如設(shè)置屬性值。 |
generate-sources(生成源代碼) | 生成包含在編譯階段中的任何源代碼。 |
process-sources(處理源代碼) | 處理源代碼,比如說,過濾任意值。 |
generate-resources(生成資源文件) | 生成將會(huì)包含在項(xiàng)目包中的資源文件。 |
process-resources (處理資源文件) | 復(fù)制和處理資源到目標(biāo)目錄,為打包階段最好準(zhǔn)備。 |
compile(編譯) | 編譯項(xiàng)目的源代碼。 |
process-classes(處理類文件) | 處理編譯生成的文件,比如說對(duì)Java class文件做字節(jié)碼改善優(yōu)化。 |
generate-test-sources(生成測(cè)試源代碼) | 生成包含在編譯階段中的任何測(cè)試源代碼。 |
process-test-sources(處理測(cè)試源代碼) | 處理測(cè)試源代碼,比如說,過濾任意值。 |
generate-test-resources(生成測(cè)試資源文件) | 為測(cè)試創(chuàng)建資源文件。 |
process-test-resources(處理測(cè)試資源文件) | 復(fù)制和處理測(cè)試資源到目標(biāo)目錄。 |
test-compile(編譯測(cè)試源碼) | 編譯測(cè)試源代碼到測(cè)試目標(biāo)目錄. |
process-test-classes(處理測(cè)試類文件) | 處理測(cè)試源碼編譯生成的文件。 |
test(測(cè)試) | 使用合適的單元測(cè)試框架運(yùn)行測(cè)試(Juint是其中之一)。 |
prepare-package(準(zhǔn)備打包) | 在實(shí)際打包之前,執(zhí)行任何的必要的操作為打包做準(zhǔn)備。 |
package(打包) | 將編譯后的代碼打包成可分發(fā)格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成測(cè)試前) | 在執(zhí)行集成測(cè)試前進(jìn)行必要的動(dòng)作。比如說,搭建需要的環(huán)境。 |
integration-test(集成測(cè)試) | 處理和部署項(xiàng)目到可以運(yùn)行集成測(cè)試環(huán)境中。 |
post-integration-test(集成測(cè)試后) | 在執(zhí)行集成測(cè)試完成后進(jìn)行必要的動(dòng)作。比如說,清理集成測(cè)試環(huán)境。 |
verify (驗(yàn)證) | 運(yùn)行任意的檢查來驗(yàn)證項(xiàng)目包有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)。 |
install(安裝) | 安裝項(xiàng)目包到本地倉(cāng)庫(kù),這樣項(xiàng)目包可以用作其他本地項(xiàng)目的依賴。 |
deploy(部署) | 將最終的項(xiàng)目包復(fù)制到遠(yuǎn)程倉(cāng)庫(kù)中與其他開發(fā)者和項(xiàng)目共享。 |
有一些與 Maven 生命周期相關(guān)的重要概念需要說明:
當(dāng)一個(gè)階段通過 Maven 命令調(diào)用時(shí),例如 mvn compile,只有該階段之前以及包括該階段在內(nèi)的所有階段會(huì)被執(zhí)行。
不同的 maven 目標(biāo)將根據(jù)打包的類型(JAR / WAR / EAR),被綁定到不同的 Maven 生命周期階段。
在下面的實(shí)例中,我們將 maven-antrun-plugin:run 目標(biāo)添加到 Build 生命周期的一部分階段中。這樣我們可以顯示生命周期的文本信息。
我們已經(jīng)更新了 C:\MVN\project 目錄下的 pom.xml 文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <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>
現(xiàn)在打開命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行以下 mvn 命令。
C:\MVN\project>mvn compile
Maven 將會(huì)開始處理并顯示直到編譯階段的構(gòu)建生命周期的各個(gè)階段。
[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] ------------------------------------------------------------------
在開發(fā)環(huán)境中,使用下面的命令去構(gòu)建、安裝工程到本地倉(cāng)庫(kù)
mvn install
這個(gè)命令在執(zhí)行 install 階段前,按順序執(zhí)行了 default 生命周期的階段 (validate,compile,package,等等),我們只需要調(diào)用最后一個(gè)階段,如這里是 install。
在構(gòu)建環(huán)境中,使用下面的調(diào)用來純凈地構(gòu)建和部署項(xiàng)目到共享倉(cāng)庫(kù)中
mvn clean deploy
這行命令也可以用于多模塊的情況下,即包含多個(gè)子項(xiàng)目的項(xiàng)目,Maven 會(huì)在每一個(gè)子項(xiàng)目執(zhí)行 clean 命令,然后再執(zhí)行 deploy 命令。
Maven Site 插件一般用來創(chuàng)建新的報(bào)告文檔、部署站點(diǎn)等。
pre-site:執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作
site:生成項(xiàng)目的站點(diǎn)文檔
post-site: 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備
site-deploy:將生成的站點(diǎn)文檔部署到特定的服務(wù)器上
這里經(jīng)常用到的是site階段和site-deploy階段,用以生成和發(fā)布Maven站點(diǎn),這可是Maven相當(dāng)強(qiáng)大的功能,Manager比較喜歡,文檔及統(tǒng)計(jì)數(shù)據(jù)自動(dòng)生成,很好看。 在下面的實(shí)例中,我們將 maven-antrun-plugin:run 目標(biāo)添加到 Site 生命周期的所有階段中。這樣我們可以顯示生命周期的所有文本信息。
我們已經(jīng)更新了 C:\MVN\project 目錄下的 pom.xml 文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <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>
現(xiàn)在打開命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行以下 mvn 命令。
C:\MVN\project>mvn site
Maven 將會(huì)開始處理并顯示直到 site 階段的 site 生命周期的各個(gè)階段。
[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] ------------------------------------------------------------------```