Maven - 构建生命周期


什么是构建生命周期?

构建生命周期是一个明确定义的阶段序列,它定义了目标的执行顺序。这里的阶段代表生命周期的一个阶段。例如,典型的Maven 构建生命周期由以下阶段序列组成。

阶段 手柄 描述
准备资源 资源复制 此阶段可以自定义资源复制。
证实 验证信息 验证项目是否正确以及所有必要的信息是否可用。
编译 汇编 源代码编译是在这个阶段完成的。
测试 测试 测试适合测试框架的编译源代码。
包裹 包装 此阶段创建 JAR/WAR 包,如 POM.xml 中的打包所述。
安装 安装 此阶段将包安装在本地/远程 Maven 存储库中。
部署 部署 将最终包复制到远程存储库。

总是有注册目标的前阶段阶段,它们必须在特定阶段之前或之后运行。

当 Maven 开始构建项目时,它会逐步执行定义的阶段序列并执行在每个阶段中注册的目标。

Maven 具有以下三个标准生命周期 -

  • 干净的
  • 默认(或构建)
  • 地点

目标代表有助于项目构建和管理的具体任务它可能绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。

执行顺序取决于目标和构建阶段的调用顺序。例如,考虑下面的命令。clean和package参数是构建阶段,而dependency :copy-dependencies是目标。

mvn clean dependency:copy-dependencies package

这里首先执行clean阶段,然后执行dependency:copy-dependencies goal,最后执行package阶段。

清洁生命周期

当我们执行mvn post-clean命令时,Maven 会调用由以下阶段组成的 clean 生命周期。

  • 预清洁
  • 干净的
  • 后清洁

Maven clean 目标 (clean:clean) 绑定到clean 生命周期中的clean阶段。它的clean:cleangoal通过删除构建目录来删除构建的输出。因此,当mvn clean命令执行时,Maven 会删除构建目录。

我们可以通过提及清洁生命周期的上述任何阶段中的目标来自定义此Behave。

在下面的示例中,我们将把 maven-antrun-plugin:run 目标附加到 pre-clean、clean 和 post-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。后清理阶段不会执行任何操作。

默认(或构建)生命周期

这是 Maven 的主要生命周期,用于构建应用程序。它有以下21个阶段。

先生。 生命周期阶段和描述
1

证实

验证项目是否正确以及完成构建过程所需的所有必要信息是否可用。

2

初始化

初始化构建状态,例如设置属性。

3

生成源

生成要包含在编译阶段的任何源代码。

4

过程源

处理源代码,例如过滤任意值。

5

生成资源

生成要包含在包中的资源。

6

流程资源

将资源复制并处理到目标目录中,为打包阶段做好准备。

7

编译

编译项目的源代码。

8

过程类

对编译生成的文件进行后处理,例如对 Java 类进行字节码增强/优化。

9

生成测试源

生成要包含在编译阶段的任何测试源代码。

10

过程测试源

处理测试源代码,例如过滤任何值。

11

测试编译

将测试源代码编译到测试目标目录中。

12

过程测试类

处理测试代码文件编译生成的文件。

13

测试

使用合适的单元测试框架(Junit 就是其中之一)运行测试。

14

准备包

在实际包装之前执行准备包装所需的任何操作。

15

包裹

获取已编译的代码并将其打包为其可分发的格式,例如 JAR、WAR 或 EAR 文件。

16

预集成测试

在执行集成测试之前执行所需的操作。例如,设置所需的环境。

17 号

集成测试

如有必要,处理包并将其部署到可以运行集成测试的环境中。

18

集成后测试

执行集成测试后执行所需的操作。例如,净化环境。

19

核实

进行任何检查以验证包裹是否有效并符合质量标准。

20

安装

将包安装到本地存储库中,可以作为本地其他项目的依赖项。

21

部署

将最终包复制到远程存储库,以便与其他开发人员和项目共享。

有几个与 Maven 生命周期相关的重要概念值得一提 -

  • 当通过 Maven 命令(例如mvncompile )调用某个阶段时,只有该阶段之前(包括该阶段)的阶段才会执行。

  • 根据打包类型(JAR / WAR / EAR),不同的 Maven 目标将绑定到 Maven 生命周期的不同阶段。

在下面的示例中,我们将把 maven-antrun-plugin:run 目标附加到 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 将开始处理并显示构建生命周期的各个阶段,直到编译阶段。

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>

网站生命周期

Maven 站点插件通常用于创建新文档以创建报告、部署站点等。它有以下阶段 -

  • 预现场
  • 地点
  • 后站
  • 站点部署

在下面的示例中,我们将把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-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 将开始处理并显示站点生命周期的各个阶段,直至站点阶段。

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>