構(gòu)建生命周期是一組階段的序列(sequence of phases),每個(gè)階段定義了目標(biāo)被執(zhí)行的順序。這里的階段是生命周期的一部分。
舉例說(shuō)明,一個(gè)典型的 Maven 構(gòu)建生命周期是由以下幾個(gè)階段的序列組成的:
階段 | 處理 | 描述 |
---|---|---|
prepare-resources | 資源拷貝 | 本階段可以自定義需要拷貝的資源 |
compile | 編譯 | 本階段完成源代碼編譯 |
package | 打包 | 本階段根據(jù) pom.xml 中描述的打包配置創(chuàng)建 JAR / WAR 包 |
install | 安裝 | 本階段在本地 / 遠(yuǎn)程倉(cāng)庫(kù)中安裝工程包 |
當(dāng)需要在某個(gè)特定階段之前或之后執(zhí)行目標(biāo)時(shí),可以使用 pre 和 post 來(lái)定義這個(gè)目標(biāo)。
當(dāng) Maven 開(kāi)始構(gòu)建工程,會(huì)按照所定義的階段序列的順序執(zhí)行每個(gè)階段注冊(cè)的目標(biāo)。Maven 有以下三個(gè)標(biāo)準(zhǔn)的生命周期:
目標(biāo)表示一個(gè)特定的、對(duì)構(gòu)建和管理工程有幫助的任務(wù)。它可能綁定了 0 個(gè)或多個(gè)構(gòu)建階段。沒(méi)有綁定任何構(gòu)建階段的目標(biāo)可以在構(gòu)建生命周期之外被直接調(diào)用執(zhí)行。
執(zhí)行的順序依賴(lài)于目標(biāo)和構(gòu)建階段被調(diào)用的順序。例如,考慮下面的命令。clean 和 package 參數(shù)是構(gòu)建階段,而 dependency:copy-dependencies 是一個(gè)目標(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 生命周期,它包含以下階段。
Maven 的 clean 目標(biāo)(clean:clean)綁定到了 clean 生命周期的 clean 階段。它的 clean:clean 目標(biāo)通過(guò)刪除構(gòu)建目錄刪除了構(gòu)建輸出。所以當(dāng) mvn clean 命令執(zhí)行時(shí),Maven 刪除了構(gòu)建目錄。
我們可以通過(guò)在上面的 clean 生命周期的任何階段定義目標(biāo)來(lái)修改這部分的操作行為。
在下面的例子中,我們將 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)在打開(kāi)命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行下面的 mvn 命令。
C:\MVN\project>mvn post-clean
Maven 將會(huì)開(kāi)始處理并顯示 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 命令,來(lái)顯示 pre-clean 和 clean,而在 post-clean 階段不執(zhí)行任何操作。
這是 Maven 的主要生命周期,被用于構(gòu)建應(yīng)用。包括下面的 23 個(gè)階段。
生命周期階段 | 描述 |
---|---|
validate | 檢查工程配置是否正確,完成構(gòu)建過(guò)程的所有必要信息是否能夠獲取到。 |
initialize | 初始化構(gòu)建狀態(tài),例如設(shè)置屬性。 |
generate-sources | 生成編譯階段需要包含的任何源碼文件。 |
process-sources | 處理源代碼,例如,過(guò)濾任何值(filter any value)。 |
generate-resources | 生成工程包中需要包含的資源文件。 |
process-resources | 拷貝和處理資源文件到目的目錄中,為打包階段做準(zhǔn)備。 |
compile | 編譯工程源碼。 |
process-classes | 處理編譯生成的文件,例如 Java Class 字節(jié)碼的加強(qiáng)和優(yōu)化。 |
generate-test-sources | 生成編譯階段需要包含的任何測(cè)試源代碼。 |
process-test-sources | 處理測(cè)試源代碼,例如,過(guò)濾任何值(filter any values)。 |
test-compile | 編譯測(cè)試源代碼到測(cè)試目的目錄。 |
process-test-classes | 處理測(cè)試代碼文件編譯后生成的文件。 |
test | 使用適當(dāng)?shù)膯卧獪y(cè)試框架(例如JUnit)運(yùn)行測(cè)試。 |
prepare-package | 在真正打包之前,為準(zhǔn)備打包執(zhí)行任何必要的操作。 |
package | 獲取編譯后的代碼,并按照可發(fā)布的格式進(jìn)行打包,例如 JAR、WAR 或者 EAR 文件。 |
pre-integration-test | 在集成測(cè)試執(zhí)行之前,執(zhí)行所需的操作。例如,設(shè)置所需的環(huán)境變量。 |
integration-test | 處理和部署必須的工程包到集成測(cè)試能夠運(yùn)行的環(huán)境中。 |
post-integration-test | 在集成測(cè)試被執(zhí)行后執(zhí)行必要的操作。例如,清理環(huán)境。 |
verify | 運(yùn)行檢查操作來(lái)驗(yàn)證工程包是有效的,并滿(mǎn)足質(zhì)量要求。 |
install | 安裝工程包到本地倉(cāng)庫(kù)中,該倉(cāng)庫(kù)可以作為本地其他工程的依賴(lài)。 |
deploy | 拷貝最終的工程包到遠(yuǎn)程倉(cāng)庫(kù)中,以共享給其他開(kāi)發(fā)人員和工程。 |
有一些與 Maven 生命周期相關(guān)的重要概念需要說(shuō)明:
當(dāng)一個(gè)階段通過(guò) Maven 命令調(diào)用時(shí),例如 mvn compile,只有該階段之前以及包括該階段在內(nèi)的所有階段會(huì)被執(zhí)行。
不同的 maven 目標(biāo)將根據(jù)打包的類(lèi)型(JAR / WAR / EAR),被綁定到不同的 Maven 生命周期階段。
在下面的例子中,我們將 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)在打開(kāi)命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行以下 mvn 命令。
C:\MVN\project>mvn compile
Maven 將會(huì)開(kāi)始處理并顯示直到編譯階段的構(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] ------------------------------------------------------------------
Maven Site 插件一般用來(lái)創(chuàng)建新的報(bào)告文檔、部署站點(diǎn)等。
階段:
在下面的例子中,我們將 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)在打開(kāi)命令控制臺(tái),跳轉(zhuǎn)到 pom.xml 所在目錄,并執(zhí)行以下 mvn 命令。
C:\MVN\project>mvn site
Maven 將會(huì)開(kāi)始處理并顯示直到 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] ------------------------------------------------------------------```
更多建議: