Maven构建生命周期详细介绍

作者:刘晓春 时间:2023-04-06 13:02:59 

什么是构建生命周期

构建生命周期是一组阶段的序列(sequence of phases),这些构建生命周期中的每一个由构建阶段的不同列表定义,其中构建阶段表示生命周期中的阶段。

例如,默认(default)的生命周期包括以下阶段(注意:这里是简化的阶段,用于生命周期阶段的完整列表):

验证(validate) - 验证项目是否正确,所有必要的信息可用
编译(compile) - 编译项目的源代码
测试(test) - 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
打包(package) - 采用编译的代码,并以其可分配格式(如JAR)进行打包。
验证(verify) - 对集成测试的结果执行任何检查,以确保满足质量标准
安装(install) - 将软件包安装到本地存储库中,用作本地其他项目的依赖项
部署(deploy) - 在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。每个阶段定义了目标被执行的顺序。这里的阶段是生命周期的一部分。

举例说明,一个典型的 Maven 构建生命周期是由以下几个阶段的序列组成的:

阶段处理描述
prepare-resources资源拷贝本阶段可以自定义需要拷贝的资源
compile编译本阶段完成源代码编译
package打包本阶段根据 pom.xml 中描述的打包配置创建 JAR / WAR 包
install安装本阶段在本地 / 远程仓库中安装工程包

当需要在某个特定阶段之前或之后执行目标时,可以使用 pre 和 post 来定义这个目标。

当 Maven 开始构建工程,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。Maven 有以下三个标准的生命周期:

clean
default(or build)
site

目标表示一个特定的、对构建和管理工程有帮助的任务。它可能绑定了 0 个或多个构建阶段。没有绑定任何构建阶段的目标可以在构建生命周期之外被直接调用执行。

执行的顺序依赖于目标和构建阶段被调用的顺序。例如,考虑下面的命令。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:clean 目标通过删除构建目录删除了构建输出。所以当 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 生命周期的所有阶段。


[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 阶段不执行任何操作。

Default (or Build) 生命周期
这是 Maven 的主要生命周期,被用于构建应用。包括下面的 23 个阶段。

生命周期阶段描述
validate检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
initialize初始化构建状态,例如设置属性。
generate-sources生成编译阶段需要包含的任何源码文件。
process-sources处理源代码,例如,过滤任何值(filter any value)。
generate-resources生成工程包中需要包含的资源文件。
process-resources拷贝和处理资源文件到目的目录中,为打包阶段做准备。
compile编译工程源码。
process-classes处理编译生成的文件,例如 Java Class 字节码的加强和优化。
generate-test-sources生成编译阶段需要包含的任何测试源代码。
process-test-sources处理测试源代码,例如,过滤任何值(filter any values)。
test-compile编译测试源代码到测试目的目录。
process-test-classes处理测试代码文件编译后生成的文件。
test使用适当的单元测试框架(例如JUnit)运行测试。
prepare-package在真正打包之前,为准备打包执行任何必要的操作。
package获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
pre-integration-test在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
integration-test处理和部署必须的工程包到集成测试能够运行的环境中。
post-integration-test在集成测试被执行后执行必要的操作。例如,清理环境。
verify运行检查操作来验证工程包是有效的,并满足质量要求。
install安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
deploy拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

有一些与 Maven 生命周期相关的重要概念需要说明:

当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。

不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 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 将会开始处理并显示直到编译阶段的构建生命周期的各个阶段。


[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 将会开始处理并显示直到 site 阶段的 site 生命周期的各个阶段。


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

来源:http://blog.csdn.net/augus3344/article/details/51793602

标签:maven,构建生命周期
0
投稿

猜你喜欢

  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • Java基于命令模式实现邮局发信功能详解

    2023-07-03 04:57:25
  • Java 完美判断中文字符的方法

    2023-01-07 19:14:54
  • Java实现的求逆矩阵算法示例

    2023-05-02 03:02:56
  • Android网格布局GridView实现漂亮的多选效果

    2023-10-20 08:52:38
  • Kotlin实用语法糖空安全类型转换及相等性判断

    2021-09-03 20:23:49
  • Java字符串操作和C#字符串操作的不同小结

    2022-02-15 07:21:14
  • Swagger2匹配多个controller代码实例

    2022-07-31 03:42:24
  • Mybatis返回插入的主键问题解决方案

    2023-05-06 02:58:03
  • 读取Java文件到byte数组的三种方法(总结)

    2023-08-01 17:19:39
  • 使用SpringBoot 工厂模式自动注入到Map

    2021-12-22 10:02:42
  • Java 根据网址查询DNS/IP地址的方法

    2023-06-21 15:31:54
  • 详细分析Java Lambda表达式

    2021-06-20 04:32:19
  • github上的java项目怎么运行(面向小白)

    2022-12-23 23:29:09
  • Java Maven依赖传递,可选依赖,排除依赖详解

    2022-06-09 14:24:14
  • C++ 风靡一时的连连看游戏的实现流程详解

    2022-10-08 13:39:12
  • maven为MANIFEST.MF文件添加内容的方法

    2022-10-29 11:15:56
  • Java线程安全解决方案(synchronized,ReentrantLock,Atomic)

    2022-06-13 12:51:09
  • SpringBoot详细讲解异步任务如何获取HttpServletRequest

    2023-01-04 18:01:09
  • SpringMVC静态资源访问问题如何解决

    2021-06-04 15:58:55
  • asp之家 软件编程 m.aspxhome.com