什么是构建生命周期

构建生命周期是一组阶段的序列(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] ------------------------------------------------------------------

以上就是Maven构建生命的一个周期,了解掌握了之后,可以在每个周期后添加task进去。

有问题可以在下面评论,技术问题可以私聊我。

Maven构建的生命周期的更多相关文章

  1. 介绍maven构建的生命周期

    介绍maven构建的生命周期 这篇是 https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html 的 ...

  2. Maven整理笔记の生命周期和插件

    项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件 ...

  3. Maven专题3——生命周期与插件

    三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的 ...

  4. 项目构建之maven篇:6.生命周期与插件

    项目生命周期 清理 初始化 编译 測试 打包 部署 三套生命周期 1.clean pre-clean 运行一些须要在clean之前完毕的工作 clean 移除全部上一次构建生成的文件 post-cle ...

  5. maven的三大生命周期

    一.Maven的生命周期 Maven的生命周期就是对所有的构建过程进行抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤. Maven的生命周期 ...

  6. maven核心概念--生命周期

    maven有一个命令,mvn package,该命令行并没有指定一个插件目标, 而是指定了一个Maven生命周期阶段.一个阶段是在被Maven称为"构建生命周期"中的一个步骤.生命 ...

  7. 010.[转] maven的三大生命周期

    一.Maven的生命周期 Maven的生命周期就是对所有的构建过程进行抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤. Maven的生命周期 ...

  8. maven入门-- part3 生命周期

    简介: Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作. Default ...

  9. Maven项目的生命周期

    Maven中存在三套生命周期,每一套生命周期相互独立,互不影响.在一套生命周期内,执行后面的命令前面的命令会自动执行. CleanLifeCycle:清理生命周期 mvn clean DefaultL ...

随机推荐

  1. 全文搜索(AC-1)-互联网信息过载问题

    什么是信息过载? 信息检索技术是什么? 信息过滤技术是什么?

  2. SBT 模板不完全总结,后续待填

    ; ; ; ; ){ ; &&k<T[r].key)||(T[r].right==&&k>T[r].key)){ );      }             ...

  3. NOIP2012 文化之旅

    题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可 ...

  4. 调用系统文件管理器选择图片,调用系统裁剪AIP对图片处理,显示裁剪之后的图片

    package com.pingyijinren.test; import android.annotation.TargetApi; import android.app.Notification; ...

  5. Codeforces Round #482 (Div. 2) C Kuro and Walking Route

    C. Kuro and Walking Route time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. Jam's balance set 暴力

    Jim has a balance and N weights. (1≤N≤20)(1≤N≤20) The balance can only tell whether things on differ ...

  7. SAP EP 设置Portal别名安全模式

    Securing the Portal Alias Cookie Context We recommend that you set the portal alias cookie to be del ...

  8. 基于Wi-Fi的HID注射器,利用WHID攻击实验

    WHID代表基于 Wi-Fi 的 HID 注射器,即对 HID 攻击进行无线化攻击的一种注入工具. 实验攻击原理如下图: 攻击者使用ESP8266作为AP,在自己的电脑创建客户端连接AP.在客户端键入 ...

  9. 玩转iOS开发 - 消息推送

    消息推送

  10. 重置网络命令win7

    开始→运行→输入:CMD 点击确定(或按回车键),打开命令提示符窗口. 在命令提示符中输入:netsh winsock reset (按回车键执行命令) 稍后,会有成功的提示:成功地重置Winsock ...