Maven 构建生命周期

来源:互联网 发布:桌面软件开发语言 编辑:程序博客网 时间:2024/04/26 15:04

Maven 的一个核心概念,Build Lifecycle,构建生命周期,明确地定义了一个项目构建跟发布的过程

Maven 有三个内建的构建生命周期:default,clean 和 site。

  • default:项目部署的处理
  • clean:项目清理的处理
  • site:项目站点文档创建的处理

构建生命周期都由不同的阶段(Phase)构成

例如,default 生命周期由以下阶段构成,需要查看完整列表,参考这里

  • validate - 验证项目是否正确且所有必须信息是可用的
  • compile - 编译项目源码
  • test - 使用合适的测试框架对编译好的源码进行测试,这些测试不应要求源码被打包或部署
  • package - 根据指定的格式打包编译好的源码,如 JAR
  • verify - 对集成测试的结果进行检查,以保证质量达标
  • install - 安装打包的项目到本地仓库,以供其他项目使用
  • deploy - 在构建环境中完成,将最后的包复制到远程仓库,以便与其他开发人员和项目共享

为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。

命令行调用

在开发环境中,使用下面的命令去构建、安装工程到本地仓库

mvn install

这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install

在构建环境中,使用下面的调用来纯净地构建和部署项目到共享仓库中

mvn clean deploy

这行命令也可以用于多模块的情况下,即包含多个子项目的项目,Maven 会在每一个子项目执行 clean 命令,然后再执行 deploy 命令。

构建阶段由插件目标构成

即使每个构建阶段负责周期中特定的步骤,它完成这些步骤的方式可能是不同的。这依赖于绑定在这些阶段的插件目标。
一个插件目标代表一个特定的任务(比构建阶段更为精细),这有助于项目的构建和管理。这些目标可能被绑定到多个阶段或者无绑定。不绑定到任何构建阶段的目标可以在构建生命周期之外通过直接调用执行。这些目标的执行顺序取决于调用目标和构建阶段的顺序。

例如,考虑下面的命令:
cleanpakage 是构建阶段,dependency:copy-dependencies 是目标

mvn clean dependency:copy-dependencies package

执行命令后,首先 clean 阶段会被执行(意味着这会执行所有位于clean阶段前面的阶段,然后是 clean),然后执行 dependency:copy-dependencies 目标,最后是 package 阶段。

此外,如果一个目标被绑定到一个或多个构建阶段,那么所有阶段都将调用这个目标。

同时,构建阶段还可以有零个或多个目标绑定到它。如果构建阶段没有绑定的目标,则构建阶段将不会执行。但是,如果它有一个或多个目标绑定到它,它将执行所有这些目标。

设置项目的构建生命周期

构建生命周期的使用很简单,但是当你使用Maven构建一个项目时,你如何指定任务到那些阶段上呢?

Packaging

首先,最常用的方法,是通过设置 pom.xml 中 <packaging> 元素的值。一些有效的 packaging 的值是 jarwarear 、和 pom 。如果没有显示地指定值,默认是 jar

每个 packaging 包含一个绑定到特定阶段的目标列表。例如,jar打包将绑定以下目标以构建 default 生命周期的各个阶段。

phase goal process-resources resources:resources compile compiler:compile process-test-resources resources:testResources test-compile compiler:testCompile test surefire:test package jar:jar install install:install deploy deploy:deploy


这是个标准的绑定集,然而,一些 packagings 的处理方式不同。例如,一个纯粹的元数据项目(packaging 的值为 pom)仅仅绑定目标到 installdeploy 阶段。

请注意,对于某些可用的 packaging 类型,你可能还需要将一个特定的插件包含在 POM 的 <build> 部分中,并指定该插件的 <extensions>true</extensions>

插件

添加目标到阶段的第二个方法是在项目中配置插件。每个插件都有一个或多个目标。例如,Compiler 插件有两个目标:compiletestCompile 。前者编译源码,后者编译测试源码。

正如你在后面章节中看到的,插件可以包含指示目标绑定到哪个生命周期阶段的信息。注意,单独添加插件是不够的-还必须指定要作为构建的一部分运行的目标。

所配置的目标将被添加到已从 packaging 选择的生命周期中绑定到的目标中。如果将多个目标绑定到某个特定的阶段,那么使用的顺序是首先从 packaging 中执行,然后是在 POM 中配置的那些。注意,你可以使用 <executions> 元素来获得对特定目标顺序的更多控制权。

例如,Modello 插件默认绑定它的目标 modello:javagenerate-sources 阶段(注:modello:java 生成 Java 源代码),我们可以配置它的一些信息:

<plugin>   <groupId>org.codehaus.modello</groupId>   <artifactId>modello-maven-plugin</artifactId>   <version>1.8.1</version>   <executions>     <execution>       <configuration>         <models>           <model>src/main/mdo/maven.mdo</model>         </models>         <version>4.0.0</version>       </configuration>       <goals>         <goal>java</goal>       </goals>     </execution>   </executions> </plugin>


如何指定插件目标绑定的阶段呢。例如,如果你有一个目标 display:time 来输出最近的时间到命令行,并且你想让它在 process-test-resources 阶段运行,那么可以这样配置:

 <plugin>   <groupId>com.mycompany.example</groupId>   <artifactId>display-maven-plugin</artifactId>   <version>1.0</version>   <executions>     <execution>       <phase>process-test-resources</phase>       <goals>         <goal>time</goal>       </goals>     </execution>   </executions> </plugin>
原创粉丝点击