Maven学习笔记(五)——生命周期与插件

目录

  • 生命周期定义
  • 生命周期详解
    • 三套生命周期
    • clean生命周期
    • default生命周期
    • site生命周期
    • 命令行与生命周期
  • 插件目标
  • 插件绑定
    • 内置绑定
    • 自定义绑定
  • 插件配置
    • 命令行插件配置
    • POM中插件全局配置
    • POM中插件任务配置
  • 获取插件信息
    • 在线插件信息
    • 使用maven-help-plugin描述插件
  • 从命令行调用插件
  • 插件解析机制
    • 插件仓库
    • 插件默认的groupId
    • 解析插件版本

生命周期定义

Maven的生命周期就是为了对所有的构建过程进行统一和抽象。这个生命周期包括项目的清理、初始化、编译、测试、打包、集成测试、部署和站点生成等几乎所有的构建步骤。几乎所有项目的构建,都能映射到这样一个生命周期上。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都由插件来完成。这种思想与设计模式的模板方法相似。
Maven的生命周期和插件机制一方面保证了所有Maven项目有一致的构建标准,另一方面又通过默认插件简化和稳定了实际项目的构建。此外,该机制还提供了足够的扩展空间,用户可以通过配置现有插件或者自行编写插件来自定义构建行为。

生命周期详解

三套生命周期

Maven拥有三套独立的生命周期,分别是clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立项目站点。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的方式就是调用这些生命周期阶段。
生命周期前后阶段具有依赖关系,但三套生命周期本身是相互独立的。

clean生命周期

clean生命周期的目的是清理项目,它包含三个阶段:

  • pre-clean执行一些清理前需要完成的工作
  • clean清理上一次构建生成的文件
  • post-clean执行一些清理后需要完成的工作

default生命周期

default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其部分主要阶段如下:

  • process-sources 处理项目主资源文件。一般是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中
  • compile 编译项目的主源码。一般是编译src/main/java目录下的Java文件到项目输出的主classpath目录中
  • process-test-sources 处理项目测试资源文件。一般是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中
  • test-compile 编译项目的测试代码。一般是编译src/test/java目录下的Java文件到项目输出的测试classpath目录中
  • test使用单元测试框架运行测试,测试代码不会被打包或部署
  • install将包安装到Maven本地仓库,供本地其他Maven项目使用
  • deploy将最终的包安装到远程仓库,供其他开发人员和Maven项目使用

site生命周期

site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,包含以下阶段:

  • pre-site 执行一些生成项目站点之前需要完成的工作
  • site 生成项目站点文档
  • post-site 执行一些在生成项目站点之后需要完成的工作
  • site-deploy 将生成的站点项目发布的服务器上

命令行与生命周期

从命令行执行Maven任务的最主要的方式就是调用Maven的生命周期阶段。下面介绍一些常见的Maven命令与其执行的生命周期:

  • mvn clean:该命令调用clean生命周期的clean阶段
  • mvn test:该命令调用default生命周期的test阶段
  • mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段
  • mvn clean install site-deploy:该命令调用clean生命周期的clean阶段,default生命周期的deploy阶段,以及site生命周期的site-deploy阶段

插件目标

对于插件本身,为了能够复用代码,它往往能够完成多个任务。为每个功能写一个独立的插件显然是不可取的,因为这些任务背后有很多的可以复用的代码,因此,这些功能聚集在一个插件里,每个功能就是一个插件目标。

插件绑定

Maven生命周期与插件相互绑定,用以完成实际的构建任务。具体是生命周期阶段与插件目标的相互绑定,以完成某个具体的构建任务。

内置绑定

default生命周期内置插件绑定关系及具体任务如下:
Maven学习笔记(五)——生命周期与插件_第1张图片

自定义绑定

用户可以自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构件过程中执行更多更有特色的任务。

插件配置

用户可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求。

命令行插件配置

可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。

POM中插件全局配置

有的参数的值从项目创建到项目发布都不会改变,或者很少改变,对于这种情况,在POM文件中一次性配置就显然比重复在命令行中输入要方便。

POM中插件任务配置

可以为某个插件任务配置特定的参数

获取插件信息

在线插件信息

基本上所有主要的Maven插件都来自Apache和Codehaus。

使用maven-help-plugin描述插件

从命令行调用插件

可以通过mvn命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标。但Maven还支持直接从命令行调用插件目标,Maven支持这种方式是因为有些任务不适合绑定在生命周期上。

插件解析机制

插件仓库

与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。但Maven会区别对待依赖的远程仓库与插件的远程仓库,当Maven需要的依赖在本地仓库不存在时,它会去配置的远程仓库查找,可是当Maven需要的插件在本地仓库不存在时,它不会去远程仓库寻找。

插件默认的groupId

在POM中配置插件时,如果该插件时Maven的官方插件,就可以省略groupId配置。
但并不推荐这么做,因为这样可能让其他人感到费解。

解析插件版本

在用户没有提供插件版本的情况下,Maven会自动解析插件版本。
Maven在超级POM中为所有核心插件设定了版本,超级POM是所有Maven项目的父POM,所有项目都继承这个超级POM的配置。因此即使用户不加任何配置,Maven使用核心插件的时候,它们的版本就已经确定了。
如果用户使用某个插件时没有设定版本,而这个插件又不属于核心插件,Maven就会去检查所有仓库中可用的版本,然后做出选择。
依赖Maven解析插件版本是不推荐度的做法,会有潜在的不稳定性。推荐应一直显式地设定版本,这也解释了为什么Maven要在超级POM中为核心插件设定版本。

你可能感兴趣的:(Maven学习笔记,maven,生命周期,插件)