建立生命周期(Build Life Cycle)
什么是构建生命周期?
构建生命周期是一个明确定义的阶段序列,它定义了目标的执行顺序。 这里阶段代表生命周期的一个阶段。 例如,典型的Maven Build Lifecycle由以下几个阶段组成。
阶段 | Handles | 描述 |
---|---|---|
prepare-resources | 资源复制 | 可以在此阶段自定义资源复制。 |
validate | 验证信息 | 验证项目是否正确以及是否所有必要信息都可用。 |
compile | compilation | 源代码编译在此阶段完成。 |
Test | Testing | 测试适合测试框架的已编译源代码。 |
package | packaging | 此阶段创建JOM/WAR包,如POM.xml中的包装中所述。 |
install | installation | 此阶段将程序包安装在本地/远程maven存储库中。 |
Deploy | Deploying | 将最终包复制到远程存储库。 |
注册goals始终存在pre和post阶段,这些阶段必须在特定阶段之前或之后运行。
当Maven开始构建项目时,它会逐步完成定义的阶段序列并执行目标,这些目标在每个阶段都会注册。
Maven有以下三个标准生命周期 -
- clean
- 默认(或构建)
- site
goal代表一项有助于项目建设和管理的特定任务。 它可能绑定到零个或多个构建阶段。 未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。
执行顺序取决于调用目标和构建阶段的顺序。 例如,请考虑以下命令。 clean和package参数是构建阶段,而dependency:copy-dependencies是一个目标。
mvn clean dependency:copy-dependencies package
这里首先执行clean阶段,然后执行dependency:copy-dependencies goal ,最后执行package阶段。
清洁生命周期
当我们执行mvn post-clean命令时,Maven会调用由以下阶段组成的清洁生命周期。
- pre-clean
- clean
- post-clean
Maven清洁目标(清洁:清洁)必然会在清洁生命周期中处于clean阶段。 它clean:cleangoal通过删除构建目录来删除构建的输出。 因此,当执行mvn clean命令时,Maven删除构建目录。
我们可以通过提及清洁生命周期的任何上述阶段中的目标来定制此行为。
在下面的示例中,我们将maven-antrun-plugin:运行目标附加到预清洁,清洁和后清洁阶段。 这将允许我们回显显示清洁生命周期阶段的文本消息。
我们在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-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将开始处理并显示清洁生命周期的所有阶段。
[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和清洁。 post-clean阶段不会执行任何操作。
Default (or Build) Lifecycle
这是Maven的主要生命周期,用于构建应用程序。 它有以下21个阶段。
Sr.No. | 生命周期阶段和描述 |
---|---|
1 | validate 验证项目是否正确,并且所有必要信息都可用于完成构建过程。 |
2 | initialize 初始化构建状态,例如set属性。 |
3 | generate-sources 生成要包含在编译阶段的任何源代码。 |
4 | process-sources 处理源代码,例如,过滤任何值。 |
5 | generate-resources 生成要包含在包中的资源。 |
6 | process-resources 将资源复制并处理到目标目录,为打包阶段做好准备。 |
7 | compile 编译项目的源代码。 |
8 | process-classes 从编译中对生成的文件进行后处理,例如对Java类进行字节码增强/优化。 |
9 | generate-test-sources 生成要包含在编译阶段的任何测试源代码。 |
10 | process-test-sources 处理测试源代码,例如,过滤任何值。 |
11 | test-compile 将测试源代码编译到测试目标目录中。 |
12 | process-test-classes 从测试代码文件编译中处理生成的文件。 |
13 | test 使用合适的单元测试框架运行测试(Junit是一个)。 |
14 | prepare-package 在实际包装之前执行准备包装所需的任何操作。 |
15 | package 获取已编译的代码并将其打包为可分发的格式,例如JAR,WAR或EAR文件。 |
16 | pre-integration-test 执行集成测试之前执行所需的操作。 例如,设置所需的环境。 |
17 | integration-test 如有必要,可以将程序包处理并部署到可以运行集成测试的环境中。 |
18 | post-integration-test 执行集成测试后执行所需的操作。 例如,清理环境。 |
19 | verify 运行任何检查以验证包是否有效并符合质量标准。 |
20 | install 将软件包安装到本地存储库中,该存储库可以在本地用作其他项目的依赖项。 |
21 | deploy 将最终包复制到远程存储库以与其他开发人员和项目共享。 |
与Maven Lifecycles相关的几个重要概念值得一提 -
当通过Maven命令调用某个阶段时,例如mvn compile ,只会执行直到并包括该阶段的阶段。
根据包装类型(JAR/WAR/EAR),不同的maven目标将绑定到Maven生命周期的不同阶段。
在下面的示例中,我们将maven-antrun-plugin:run goal附加到Build生命周期的几个阶段。 这将允许我们回显显示生命周期阶段的文本消息。
我们在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>
现在打开命令控制台,转到包含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] -----------------------------------------------------------------
-
网站生命周期
Maven Site插件通常用于创建新文档以创建报告,部署站点等。它具有以下阶段 -
- pre-site
- site
- post-site
- site-deploy
在以下示例中,我们将maven-antrun-plugin:run goal附加到Site生命周期的所有阶段。 这将允许我们回显显示生命周期阶段的文本消息。
我们在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>
现在打开命令控制台,转到包含pom.xml的文件夹并执行以下mvn命令。
C:\MVN\project>mvn site
Maven将开始处理并显示站点生命周期的阶段,直至站点阶段。
[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] ------------------------------------------------------------------