构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序。这里的阶段是生命周期的一部分。

举例说明,一个典型的 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 是一个目标。

  1. 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 文件。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.companyname.projectgroup</groupId>
  7. <artifactId>project</artifactId>
  8. <version>1.0</version>
  9. <build>
  10. <plugins>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-antrun-plugin</artifactId>
  14. <version>1.1</version>
  15. <executions>
  16. <execution>
  17. <id>id.pre-clean</id>
  18. <phase>pre-clean</phase>
  19. <goals>
  20. <goal>run</goal>
  21. </goals>
  22. <configuration>
  23. <tasks>
  24. <echo>pre-clean phase</echo>
  25. </tasks>
  26. </configuration>
  27. </execution>
  28. <execution>
  29. <id>id.clean</id>
  30. <phase>clean</phase>
  31. <goals>
  32. <goal>run</goal>
  33. </goals>
  34. <configuration>
  35. <tasks>
  36. <echo>clean phase</echo>
  37. </tasks>
  38. </configuration>
  39. </execution>
  40. <execution>
  41. <id>id.post-clean</id>
  42. <phase>post-clean</phase>
  43. <goals>
  44. <goal>run</goal>
  45. </goals>
  46. <configuration>
  47. <tasks>
  48. <echo>post-clean phase</echo>
  49. </tasks>
  50. </configuration>
  51. </execution>
  52. </executions>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

现在打开命令控制台,跳转到 pom.xml 所在目录,并执行下面的 mvn 命令。

  1. C:\MVN\project>mvn post-clean

Maven 将会开始处理并显示 clean 生命周期的所有阶段。

  1. [INFO] Scanning for projects...
  2. [INFO] ------------------------------------------------------------------
  3. [INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
  4. [INFO] task-segment: [post-clean]
  5. [INFO] ------------------------------------------------------------------
  6. [INFO] [antrun:run {execution: id.pre-clean}]
  7. [INFO] Executing tasks
  8. [echo] pre-clean phase
  9. [INFO] Executed tasks
  10. [INFO] [clean:clean {execution: default-clean}]
  11. [INFO] [antrun:run {execution: id.clean}]
  12. [INFO] Executing tasks
  13. [echo] clean phase
  14. [INFO] Executed tasks
  15. [INFO] [antrun:run {execution: id.post-clean}]
  16. [INFO] Executing tasks
  17. [echo] post-clean phase
  18. [INFO] Executed tasks
  19. [INFO] ------------------------------------------------------------------
  20. [INFO] BUILD SUCCESSFUL
  21. [INFO] ------------------------------------------------------------------
  22. [INFO] Total time: < 1 second
  23. [INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
  24. [INFO] Final Memory: 4M/44M
  25. [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 文件。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.companyname.projectgroup</groupId>
  7. <artifactId>project</artifactId>
  8. <version>1.0</version>
  9. <build>
  10. <plugins>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-antrun-plugin</artifactId>
  14. <version>1.1</version>
  15. <executions>
  16. <execution>
  17. <id>id.validate</id>
  18. <phase>validate</phase>
  19. <goals>
  20. <goal>run</goal>
  21. </goals>
  22. <configuration>
  23. <tasks>
  24. <echo>validate phase</echo>
  25. </tasks>
  26. </configuration>
  27. </execution>
  28. <execution>
  29. <id>id.compile</id>
  30. <phase>compile</phase>
  31. <goals>
  32. <goal>run</goal>
  33. </goals>
  34. <configuration>
  35. <tasks>
  36. <echo>compile phase</echo>
  37. </tasks>
  38. </configuration>
  39. </execution>
  40. <execution>
  41. <id>id.test</id>
  42. <phase>test</phase>
  43. <goals>
  44. <goal>run</goal>
  45. </goals>
  46. <configuration>
  47. <tasks>
  48. <echo>test phase</echo>
  49. </tasks>
  50. </configuration>
  51. </execution>
  52. <execution>
  53. <id>id.package</id>
  54. <phase>package</phase>
  55. <goals>
  56. <goal>run</goal>
  57. </goals>
  58. <configuration>
  59. <tasks>
  60. <echo>package phase</echo>
  61. </tasks>
  62. </configuration>
  63. </execution>
  64. <execution>
  65. <id>id.deploy</id>
  66. <phase>deploy</phase>
  67. <goals>
  68. <goal>run</goal>
  69. </goals>
  70. <configuration>
  71. <tasks>
  72. <echo>deploy phase</echo>
  73. </tasks>
  74. </configuration>
  75. </execution>
  76. </executions>
  77. </plugin>
  78. </plugins>
  79. </build>
  80. </project>

现在打开命令控制台,跳转到 pom.xml 所在目录,并执行以下 mvn 命令。

  1. C:\MVN\project>mvn compile

Maven 将会开始处理并显示直到编译阶段的构建生命周期的各个阶段。

  1. [INFO] Scanning for projects...
  2. [INFO] ------------------------------------------------------------------
  3. [INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
  4. [INFO] task-segment: [compile]
  5. [INFO] ------------------------------------------------------------------
  6. [INFO] [antrun:run {execution: id.validate}]
  7. [INFO] Executing tasks
  8. [echo] validate phase
  9. [INFO] Executed tasks
  10. [INFO] [resources:resources {execution: default-resources}]
  11. [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
  12. i.e. build is platform dependent!
  13. [INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources
  14. [INFO] [compiler:compile {execution: default-compile}]
  15. [INFO] Nothing to compile - all classes are up to date
  16. [INFO] [antrun:run {execution: id.compile}]
  17. [INFO] Executing tasks
  18. [echo] compile phase
  19. [INFO] Executed tasks
  20. [INFO] ------------------------------------------------------------------
  21. [INFO] BUILD SUCCESSFUL
  22. [INFO] ------------------------------------------------------------------
  23. [INFO] Total time: 2 seconds
  24. [INFO] Finished at: Sat Jul 07 20:18:25 IST 2012
  25. [INFO] Final Memory: 7M/64M
  26. [INFO] ------------------------------------------------------------------

Site 生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等。

阶段:

  • pre-site
  • site
  • post-site
  • site-deploy

在下面的例子中,我们将 maven-antrun-plugin:run 目标添加到 Site 生命周期的所有阶段中。这样我们可以显示生命周期的所有文本信息。

我们已经更新了 C:\MVN\project 目录下的 pom.xml 文件。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.companyname.projectgroup</groupId>
  7. <artifactId>project</artifactId>
  8. <version>1.0</version>
  9. <build>
  10. <plugins>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-antrun-plugin</artifactId>
  14. <version>1.1</version>
  15. <executions>
  16. <execution>
  17. <id>id.pre-site</id>
  18. <phase>pre-site</phase>
  19. <goals>
  20. <goal>run</goal>
  21. </goals>
  22. <configuration>
  23. <tasks>
  24. <echo>pre-site phase</echo>
  25. </tasks>
  26. </configuration>
  27. </execution>
  28. <execution>
  29. <id>id.site</id>
  30. <phase>site</phase>
  31. <goals>
  32. <goal>run</goal>
  33. </goals>
  34. <configuration>
  35. <tasks>
  36. <echo>site phase</echo>
  37. </tasks>
  38. </configuration>
  39. </execution>
  40. <execution>
  41. <id>id.post-site</id>
  42. <phase>post-site</phase>
  43. <goals>
  44. <goal>run</goal>
  45. </goals>
  46. <configuration>
  47. <tasks>
  48. <echo>post-site phase</echo>
  49. </tasks>
  50. </configuration>
  51. </execution>
  52. <execution>
  53. <id>id.site-deploy</id>
  54. <phase>site-deploy</phase>
  55. <goals>
  56. <goal>run</goal>
  57. </goals>
  58. <configuration>
  59. <tasks>
  60. <echo>site-deploy phase</echo>
  61. </tasks>
  62. </configuration>
  63. </execution>
  64. </executions>
  65. </plugin>
  66. </plugins>
  67. </build>
  68. </project>

现在打开命令控制台,跳转到 pom.xml 所在目录,并执行以下 mvn 命令。

  1. C:\MVN\project>mvn site

Maven 将会开始处理并显示直到 site 阶段的 site 生命周期的各个阶段。


  1. [INFO] Scanning for projects...
  2. [INFO] ------------------------------------------------------------------
  3. [INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
  4. [INFO] task-segment: [site]
  5. [INFO] ------------------------------------------------------------------
  6. [INFO] [antrun:run {execution: id.pre-site}]
  7. [INFO] Executing tasks
  8. [echo] pre-site phase
  9. [INFO] Executed tasks
  10. [INFO] [site:site {execution: default-site}]
  11. [INFO] Generating "About" report.
  12. [INFO] Generating "Issue Tracking" report.
  13. [INFO] Generating "Project Team" report.
  14. [INFO] Generating "Dependencies" report.
  15. [INFO] Generating "Project Plugins" report.
  16. [INFO] Generating "Continuous Integration" report.
  17. [INFO] Generating "Source Repository" report.
  18. [INFO] Generating "Project License" report.
  19. [INFO] Generating "Mailing Lists" report.
  20. [INFO] Generating "Plugin Management" report.
  21. [INFO] Generating "Project Summary" report.
  22. [INFO] [antrun:run {execution: id.site}]
  23. [INFO] Executing tasks
  24. [echo] site phase
  25. [INFO] Executed tasks
  26. [INFO] ------------------------------------------------------------------
  27. [INFO] BUILD SUCCESSFUL
  28. [INFO] ------------------------------------------------------------------
  29. [INFO] Total time: 3 seconds
  30. [INFO] Finished at: Sat Jul 07 15:25:10 IST 2012
  31. [INFO] Final Memory: 24M/149M
  32. [INFO] ------------------------------------------------------------------```
    文章来源:http://wiki.jikexueyuan.com/project/maven/build-life-cycle.html

maven 学习---Maven构建生命周期的更多相关文章

  1. Maven学习(十三)-----Maven 构建生命周期

    Maven 构建生命周期 构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列. 这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准 ...

  2. Maven 构建生命周期

    构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...

  3. Apache Maven(二):构建生命周期

    Maven 约定的目录结构 我要遵循Maven已经约定好的目录结构,才能让maven在自动构建过程中找到对应的资源进行构建处理.以下是maven约定的目录结构: 项目名称 |-- pom.xml :M ...

  4. Maven的构建生命周期理解

    以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...

  5. Maven构建生命周期

    以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...

  6. 002-Apache Maven 构建生命周期

    Maven - 构建生命周期 什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典 ...

  7. Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

    Maven 使用了一个标准的目录结构和一个默认的构建生命周期. 约定优于配置 当创建 Maven 工程时,Maven 会创建默认的工程结构.开发者只需要合理的放置文件,而在 pom.xml 中不再需要 ...

  8. Java-Maven-Runoob:Maven构建生命周期

    ylbtech-Java-Maven-Runoob:Maven构建生命周期 1.返回顶部 1. Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Mave ...

  9. 4、maven——构建生命周期

    什么是生命周期? 构建生命周期是一组阶段的序列(sequence of phase),每个阶段定义了目标被执行的顺序,这里的阶段就是生命周期的一部分. 一个典型的Maven生命周期由一些几个阶段的序列 ...

随机推荐

  1. 安装新版Magisk卡在启动页面等问题以及解决办法

      手持小米9,之前更新了新版本的Magisk Manager之后,发现手机再打开会一直卡在进入界面无法启动(如下图显示)   逛了逛Github.XDA.Stack Overflow等论坛,大致结论 ...

  2. 阿里云centos7安装python3.7.4和pip3

    亲测有效,针对 阿里云 centos 7 轻量服务器 python ==> 3.7.4 pip ==>  3 一,打开python官网,找到下载Python的tgz文件,有两种方式下载 ( ...

  3. Xamarin.Forms iOS 真机测试 打包

    等着打包过程中记录一下如何打一个debug包到真机上测试的流程1. 需要在XCode中创建一个新的项目,选择iOS==>Single View App,点击Next 2. 在新的弹框中需要App ...

  4. PWA入门:手把手教你制作一个PWA应用

    摘要: PWA图文教程 原文:PWA入门:手把手教你制作一个PWA应用 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 简介 Web前端的同学是否想过学习app开发,以弥补自 ...

  5. [PHP] PHP PDO与mysql的连接单例防止超时情况处理

    这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较, ...

  6. CentOS服务器apache绑定多个域名的方法

    这篇文章主要为大家详细介绍了CentOS服务器apache绑定多个域名的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Apache是最流行的HTTP服务器软件之一,其以快速.可靠(稳定) ...

  7. Pycharm 2019 添加 docker 解释器

    打开docker的tls

  8. Pwn-TestYourMemory

    题目地址 https://dn.jarvisoj.com/challengefiles/memory.838286edf4b832fd482d58ff1c217561 32位的程序,有NX保护,拖到I ...

  9. lua 15 协程-协同程序

    转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...

  10. verilog 常见单元描述

    半加器: //行为级建模 module half_adder2(a, b, sum, c_out); input a, b; output sum, c_out; assign {c_out, sum ...