Maven构建生命周期


什么是生命周期?

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

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

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

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

Maven有以下三种标准生命周期

  • clean
  • default(或者 build)
  • site

一个 目标 表示有利于项目的建设和管理特定的任务。它可能会被绑定到零或更多的构建阶段。不受任何构建阶段限制的目标可以通过直接调用在构建生命周期之外执行。

执行顺序取决于调用目标和构建阶段的顺序。例如,请考虑下面的命令。该 cleanpackage 论点是建立阶段,而 dependency:copy-dependencies 是一个目标。

mvn clean dependency:copy-dependencies package

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

clean生命周期

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

  • pre-clean
  • clean
  • post-clean

Maven的清洁目标(clean:clean)必然会在清洁生命周期的 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 和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) ,只会执行直到并包括该阶段的阶段。

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

在以下示例中,我们将附加maven-antrun-plugin:将目标运行到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] -----------------------------------------------------------------
-

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-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] ------------------------------------------------------------------