轻量级Java EE企业应用开发实战
上QQ阅读APP看书,第一时间看更新

2.2 理解Maven构建生命周期

构建生命周期是Maven的核心概念。这意味着构建和分发特定工件(项目)的过程将会被明确定义。

对于构建项目的人员,这意味着只需要学习一小堆命令即可构建任何Maven项目,POM将确保他们获得所需的结果。

有3个内置的生命周期:default、clean和site。在default生命周期处理项目部署,在clean生命周期处理项目的清理,而在site生命周期处理项目站点文档的创建。

2.2.1 Maven阶段

构建生命周期是由阶段组成的。例如,default生命周期包括以下阶段:

  • validate:验证项目是否正确并且所有必要的信息均可用。
  • compile:编译项目的源代码。
  • test:使用合适的单元测试框架测试已编译的源代码。这些测试不应要求将代码打包或部署。
  • package:采用编译后的代码并将其打包为可分发格式,例如JAR。
  • integration-test:处理程序包并将其部署到可以运行集成测试的环境中。
  • verify:运行任何检查以验证包装是否有效并符合质量标准。
  • install:将软件包安装到本地存储库中,以作为本地其他项目中的依赖项。
  • deploy:在集成或发布环境中完成,将最终程序包复制到远程存储库,以便与其他开发人员和项目共享。

这些生命周期阶段依次执行,以完成默认生命周期。给定上述生命周期阶段,这意味着当使用默认生命周期时,Maven将首先验证项目,然后尝试编译源代码,运行这些源代码,打包二进制文件(例如JAR),运行集成测试软件包,验证集成测试,将验证的软件包安装到本地存储库,然后将安装的软件包部署到远程存储库。

换句话说,在生命周期里面阶段是连续的,在不出错的前提下,比如执行打包(Package)时就一定是执行了测试(Test)之后再执行。

2.2.2 完整的生命周期阶段

下面列出了clean、default和site生命周期所有的阶段。

1.clean生命周期

  • pre-clean:执行实际项目清理之前所需的流程。
  • clean:删除以前构建生成的所有文件。
  • post-clean:执行完成项目清理所需的流程。

2.default生命周期

  • validate:验证项目是正确的,所有必要的信息可用。
  • initialize:初始化构建状态,例如设置属性或创建目录。
  • generate-sources:生成包含在编译中的任何源代码。
  • process-sources:处理源代码,例如过滤任何值。
  • generate-resources:生成包含在包中的资源。
  • process-resources:将资源复制并处理到目标目录中,准备打包。
  • compile:编译项目的源代码。
  • process-classes:编译后处理生成的文件,例如对Java类进行字节码增强。
  • generate-test-sources:生成包含在编译中的任何测试源代码。
  • process-test-sources:处理测试源代码,例如过滤任何值。
  • generate-test-resources:创建测试资源。
  • process-test-resources:将资源复制并处理到测试目标目录中。
  • test-compile:将测试源代码编译到测试目标目录中。
  • process-test-classes:测试编译中处理生成的文件,例如对Java类进行字节码增强。
  • test:使用合适的单元测试框架运行测试。这些测试不应该要求代码被打包或部署。
  • prepare-package:在实际打包之前执行必要的准备操作。
  • package:将编译的代码,以可分发的格式(如JAR)进行打包。
  • pre-integration-test:在执行集成测试之前,执行必要的准备操作,诸如设置所需环境等。
  • integration-test:如果需要,可以将该包部署到可以运行集成测试的环境中。
  • post-integration-test:执行集成测试后执行所需的操作,可能包括清理环境。
  • verify:运行任何检查以验证包装是否有效并符合质量标准。
  • install:将软件包安装到本地存储库中,以作为本地其他项目的依赖关系。
  • deploy:在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。

3.site生命周期

  • pre-site:在实际的项目现场生成之前执行所需的进程。
  • site:生成项目的站点文档。
  • post-site:执行完成站点生成所需的进程,并准备站点部署。
  • site-deploy:将生成的站点文档部署到指定的Web服务器。

2.2.3 生命周期阶段在命令行中的调用

在开发环境中,使用以下命令来执行构建并将工件安装到本地存储库中:

    mvn install

此命令在执行安装之前按顺序执行validate、compile、package等每个默认生命周期阶段。在这种情况下,只需要调用最后一个构建阶段install即可。

在构建环境中,使用以下命令来将工件清理并部署到共享存储库中。

    mvn clean deploy

相同的命令可以在多模块场景(具有一个或多个子项目的项目)中使用。Maven遍历每个子项目并执行clean,然后执行deploy(包括之前所有构建阶段的步骤)。

注意

在开发阶段,有一些生命周期的阶段(比如validate)基本很少用到,使用关键的几个阶段就基本能满足需求。

2.2.4 使用构建生命周期来设置项目

构建生命周期足够简单,但是当需要为项目配置Maven构建时,如何将任务分配到每个构建阶段呢?

1.打包

第一种也是常见的方法是通过同样命名的POM元素<packaging>为项目设置打包。一些有效的打包值是JAR、WAR、EAR和POM。如果没有指定包装值,就默认为JAR。

每个不同类型的打包都包含要绑定到特定阶段的目标列表。例如打包值是JAR,将绑定表2-1所示的目标来构建默认生命周期的阶段。

表2-1 打包值是JAR所绑定的目标

可以这么理解,阶段列是简化的命令,插件:目标列是详细的插件加目标(命令行参数)的形式。需要注意的是,Maven都是以插件的形式存在的,包括生命周期的阶段也是一个个不同的插件组成的,比如compile阶段就是由compiler插件提供的,其中compile为这个插件的目标,也可以说是插件的命令行参数。

不同的打包方式所要绑定的阶段是不同的。例如,纯粹的元数据(打包值是POM)的项目只将目标绑定到install和deploy阶段。

注意,对于某些可用的打包类型,可能还需要在POM的<build>部分包含一个特定的插件,并为该插件指定<extensions>true</extensions>。需要这种插件的一个例子是Plexus插件,它提供plexus-application和plexus-service打包。

2.插件

将目标添加到阶段的第二种方法是在项目中配置插件。插件是为Maven提供目标的工件。此外,插件可以具有一个或多个目标,其中每个目标代表该插件的能力。例如,compiler插件有两个目标:compile和testCompile。前者编译主代码的源代码,后者编译测试代码的源代码。

插件可以包含指示将目标绑定到的生命周期阶段的信息。注意,只添加插件是不够的,还必须要指定目标。如果有多个目标绑定到特定阶段,则使用的顺序是首先执行来自打包的顺序,然后才是在POM中配置顺序。注意,可以使用<executions>元素来获得对特定目标的顺序更多的控制。

例如,Modello插件默认将目标modello:java绑定到generate-sources阶段(注意:modello:java目标生成Java源代码)。因此,要使用Modello插件,从模型生成的源代码并将其合并到构建中,配置如下:

现在,在modello:java的情况下,它只在generate-sources阶段才有意义。但是一些目标可以在多个阶段中使用。例如,假设有一个目标display:time,希望它在process-test-resources阶段运行时开始执行,则可以被配置如下: