- Maven 教程
- Maven - 首页
- Maven - 概述
- Maven - 环境设置
- Maven - POM
- Maven - 构建生命周期
- Maven - 构建配置文件
- Maven - 仓库
- Maven - 插件
- Maven - 创建项目
- Maven - 构建 & 测试项目
- Maven - 外部依赖
- Maven - 项目文档
- Maven - 项目模板
- Maven - 快照
- Maven - 构建自动化
- Maven - 管理依赖
- Maven - 部署自动化
- Maven - Web 应用
- Maven - Eclipse IDE
- Maven - NetBeans
- Maven - IntelliJ IDEA
- Maven 有用资源
- Maven - 常见问题解答
- Maven - 快速指南
- Maven - 有用资源
- Maven - 讨论
Maven - 构建生命周期
什么是构建生命周期?
构建生命周期是一系列定义良好的阶段,这些阶段定义了目标执行的顺序。此处阶段代表生命周期中的一个阶段。例如,一个典型的Maven 构建生命周期包含以下阶段序列。
| 阶段 | 处理 | 描述 |
|---|---|---|
| prepare-resources | 资源复制 | 在此阶段可以自定义资源复制。 |
| validate | 验证信息 | 验证项目是否正确以及是否提供了所有必要的信息。 |
| compile | 编译 | 在此阶段完成源代码编译。 |
| Test | 测试 | 测试编译后的源代码,适用于测试框架。 |
| package | 打包 | 此阶段创建 POM.xml 中指定的 JAR/WAR 包。 |
| install | 安装 | 此阶段将包安装到本地/远程 Maven 仓库中。 |
| Deploy | 部署 | 将最终包复制到远程仓库中。 |
始终存在pre 和post 阶段来注册目标,这些目标必须在特定阶段之前或之后运行。
当 Maven 开始构建项目时,它会依次遍历定义的阶段序列并执行与每个阶段注册的目标。
Maven 具有以下三个标准生命周期:
- clean
- default(或 build)
- site
目标代表有助于项目构建和管理的特定任务。它可能绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。
执行顺序取决于调用目标和构建阶段的顺序。例如,考虑以下命令。clean 和package 参数是构建阶段,而dependency:copy-dependencies 是一个目标。
mvn clean dependency:copy-dependencies package
此处,将首先执行clean 阶段,然后执行dependency:copy-dependencies 目标,最后执行package 阶段。
Clean 生命周期
当我们执行mvn post-clean 命令时,Maven 会调用包含以下阶段的 clean 生命周期。
- pre-clean
- clean
- post-clean
Maven clean 目标 (clean:clean) 绑定到 clean 生命周期中的clean 阶段。其clean:cleangoal 通过删除构建目录来删除构建的输出。因此,当mvn clean 命令执行时,Maven 会删除构建目录。
我们可以通过在 clean 生命周期上述任何阶段中提及目标来自定义此行为。
在以下示例中,我们将 maven-antrun-plugin:run 目标附加到 pre-clean、clean 和 post-clean 阶段。这将允许我们回显显示 clean 生命周期阶段的文本消息。
我们在 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 将开始处理并显示 clean 生命周期所有阶段。
C:\MVN>mvn post-clean
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.pre-clean) @ project ---
[INFO] Executing tasks
[echo] pre-clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ project ---
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.clean) @ project ---
[INFO] Executing tasks
[echo] clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.post-clean) @ project ---
[INFO] Executing tasks
[echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.740 s
[INFO] Finished at: 2021-12-10T20:03:53+05:30
[INFO] ------------------------------------------------------------------------
C:\MVN>
您可以尝试调整mvn clean 命令,它将显示pre-clean 和 clean。对于post-clean 阶段,不会执行任何操作。
默认(或构建)生命周期
这是 Maven 的主要生命周期,用于构建应用程序。它包含以下 21 个阶段。
| 序号 | 生命周期阶段 & 描述 |
|---|---|
| 1 | validate 验证项目是否正确以及是否提供了完成构建过程所需的所有必要信息。 |
| 2 | initialize 初始化构建状态,例如设置属性。 |
| 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 生命周期相关的一些重要概念值得一提:
当通过 Maven 命令调用阶段时,例如mvn compile,只会执行直到该阶段(包括该阶段)的所有阶段。
不同的 Maven 目标将绑定到 Maven 生命周期中的不同阶段,具体取决于打包类型 (JAR / WAR / EAR)。
在以下示例中,我们将 maven-antrun-plugin:run 目标附加到构建生命周期的几个阶段。这将允许我们回显显示生命周期阶段的文本消息。
我们已更新了 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 将开始处理并显示构建生命周期中直到 compile 阶段的所有阶段。
C:\MVN>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.validate) @ project ---
[INFO] Executing tasks
[echo] validate phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.compile) @ project ---
[INFO] Executing tasks
[echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.033 s
[INFO] Finished at: 2021-12-10T20:05:46+05:30
[INFO] ------------------------------------------------------------------------
C:\MVN>
Site 生命周期
Maven Site 插件通常用于创建新的文档,以创建报表、部署站点等。它包含以下阶段:
- pre-site
- site
- post-site
- site-deploy
在以下示例中,我们将maven-antrun-plugin:run 目标附加到 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-site-plugin</artifactId>
<version>3.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.9</version>
</plugin>
<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 生命周期阶段。
C:\MVN>mvn site [INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.projectgroup:project >---------------- [INFO] Building project 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-antrun-plugin:3.0.0:run (id.pre-site) @ project --- [INFO] Executing tasks [WARNING] [echo] pre-site phase [INFO] Executed tasks [INFO] [INFO] --- maven-site-plugin:3.7:site (default-site) @ project --- [WARNING] Input file encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [WARNING] No project URL defined - decoration links will not be relativized! [INFO] Rendering site with org.apache.maven.skins:maven-default-skin:jar:1.2 skin. [INFO] [INFO] --- maven-antrun-plugin:3.0.0:run (id.site) @ project --- [INFO] Executing tasks [WARNING] [echo] site phase [INFO] Executed tasks [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.323 s [INFO] Finished at: 2021-12-10T20:22:31+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>