前言:在日常开发中我们经常使用IDE提供的MAVEN功能,如下图所示,通过右键->run maven build的方式或者通过命令行运行maven命令的方式来对项目进行构建。在我们通过简单操作就可以对项目进行clean(清理)、default(包括校验、编译、打包、测试等)、site(部署),在背后有好多知识点,本篇博客就对这些知识点进行整理归纳。

一、什么是Maven的生命周期:

在没有Maven之前,每个项目的开发人员一般都会干这么几件事情:清理、编译、测试和部署。不同的公司以及不同的项目之间,大家往往使用不同的方式做着类似的工作。刚刚说的那四件事也就是构建一个项目的生命周期。Maven从大量项目和构建工具(Maven之前也是有构建工具的)中学习和反思,对所有的构建过程进行抽象和统一,总结出现在Maven的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有项目构建步骤;

重点:Maven的生命周期是抽象的,就好比Java中的抽象方法,只声明生命周期和阶段,但本身不做任何实际的工作,实际工作都交由插件来完成;相当于Maven定义算法的整体结构,各个插件来实现实际的行为,保证了可扩展性的同时,又严格控制了生命周期结构,优点不言而喻。下面通过下面这个图,简单来说比如我们运行clean,Maven实际调用的是maven-clean-plugin插件的clean(目标)完成的项目结构清理功能,所有生命周期阶段都会有相应的插件完成具体功能。

每个Maven构建步骤都可以绑定一个或多个插件行为(goal),同时Maven也为大多数构建步骤编写并绑定了默认插件。需要注意的是默认插件只提供默认行为实现,当有特殊需要时,比如我们在打包Springboot项目成jar包时,那样就需要引入和配置spring-boot-maven-plugin来完成打包需求。

二、三套生命周期

通过上图,大部分人会以为Maven的生命周期是一体的,即从clean->...->deploy,其实不然。Maven有三套独立的生命周期,分别为clean(清理项目)、default(构建项目)、site(建立项目站点)。每个项目周期又分为不同的阶段,比如clean生命周期下的阶段依次为:pre-clean->clean->post-clean,用户通过命令行也好,IDE提供的帮助也罢,执行Maven任务的最主要方式就是调用这些生命周期的阶段。这些生命周期的阶段是有顺序的,并且后面阶段的执行依赖于前面阶段。还是拿clean生命周期举例子:当我们调用post-clean阶段时,由于这个阶段前面存在pre-clean和clean两个阶段,最终pre-clean、clean和post-clean会得以顺序执行。其实这个现象开发过程中常见,比如我们在通过package打包springboot项目时,编译、测试、打包都得以执行。由于每个生命周期,特别是default,包含了多个阶段,在此就不一一列举了,只需要把每个生命周期的起止边界记清楚就可以了。

需要注意的是同一个生命周期的阶段调用是顺序执行,但不同生命周期间的阶段是独立的,这也就是为什么我们会用mvn clean package 这个命令对项目打包的原因了,因为clean和package分属于不同生命周期阶段。

三、插件目标:Maven的核心仅仅是定义了抽象的生命周期以及具体任务分发个具体插件执行。所以咱们接下来说说插件,先不解释,直接看图,以常见的spring-boot-maven-plugin插件举例

对于一个插件本身而言,它往往能够完成多个任务,一般来说不太可能一个任务对应一个插件。每个可以完成的任务(或者叫做插件的功能)咱们把它称作一个插件目标(goal),像spring-boot-maven-plugin插件有六个目标(goal)。每个goal的名称有英文冒号分隔,黄色框内的叫做插件前缀,绿色框内的称为插件goal。通常spring-boot:repackage就代指spring-boot-maven-plugin插件的repackage功能。

四、插件绑定

指的是Maven的生命周期和插件绑定,具体指的是Maven生命周期的阶段与插件的目标进行绑定,以完成某个构建任务。比如default生命周期中的install阶段就是与maven-install-plugin的install(install:install)目标进行绑定来完成安装包到本地仓库的任务。

内置绑定:为了让用户几乎不做任何配置就能构建Maven项目,Maven核心中就默认为一些主要的生命周期阶段绑定了很多插件的目标。内置绑定大致如下,大家简单看下即可,如果英文好一些,根据名称就可以大致了解的;

default生命周期拥有众多阶段,下表只是列出具有插件目标绑定的生命周期阶段

以下是对一个springboot项目调用mvn install的输出日志,已删除非重要内容,通过以下日志可以看出插件的执行过程:

自定义绑定:除了内置定义外我们也可以在pom文件中通过自定义plugin配置完成个性化的任务。比如我们在default生命周期的package阶段,在打包jar包的同时,把代码也打包。那么我们就可以在pom文件的plugins中增加如下配置完成该任务:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.1.1</version><executions><execution><id>attach-source</id><phase>package</phase><goals><goal>jar-no-fork</goal></goals></execution></executions>
</plugin>

简单解释下以上配置作用,即将maven-source-plugin插件的jar-no-fork目标绑定到phase元素指定的package阶段,即实现在根据编译好的代码打包的同时对源码也实现打包,日志输出如下图:

这个时候有的人可能要说了,你看下面这个配置也并没有指定生命周期的哪个阶段与插件目标进行绑定,一样可以使用这个插件的打包功能。

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

那是因为有些插件的目标在实现时已经定义了默认绑定阶段,我们可以通过以下命令查看,其中会发现默认绑定配置的

mvn help:describe -Dplugin=org.springframework.boot:spring-boot-maven-plugin:2.2.1.RELEASE -Ddetail

总结:本次重点介绍了Maven的生命周期和插件、生命周期的阶段和插件目标的概念、命令行和生命周期阶段的关系、生命周期和阶段的绑定等相关理论,相信懂了这些之后在使用IDE提供的Maven集成功能时会更近一步了解。

以上,完了!!

Maven生命周期和插件的那些事(2021版)相关推荐

  1. Maven学习总结(16)——深入理解maven生命周期和插件

    在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的b ...

  2. Maven生命周期与插件

    Maven简介 Maven是一个项目构建工具,也可以管理项目的依赖.maven将构建项目的过程分为了三个独立的生命周期,每个生命周期都有一系列的阶段,每个阶段都需要和maven的插件绑定才能执行.从这 ...

  3. Maven 生命周期和插件详解

    Maven 生命周期及其阶段 Maven 基于生命周期的核心概念.有三个内置的生命周期: clean:负责清理项目: default:负责构建项目: site:负责建立项目站点. 每个生命周期都包含一 ...

  4. 第六节:Maven生命周期和插件

    生命周期详解: Maven的生命周期就是对项目构建过程进行的抽象和统一,就是项目构建的流程.但是构建过程中每一步(例如编译源代码)的实际行为都由插件来完成的. Maven的生命周期不是一个整体,它拥有 ...

  5. Maven入门指南⑦:Maven的生命周期和插件

    Maven入门指南⑦:Maven的生命周期和插件 一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周 ...

  6. maven详解之生命周期与插件

    Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...

  7. maven(7)生命周期和插件

    [0]README 1)本文部分文字转自 "maven实战",旨在 review  "maven(7)生命周期和插件" 的相关知识: 2)maven 另外两个核 ...

  8. maven的仓库、生命周期与插件

    一.仓库 统一存储所有Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(另一种特殊的远程仓库,为节省宽带和时 ...

  9. Maven读书笔记之七(生命周期和插件)

    1. 生命周期What? Maven一般能自动化执行的生命周期有清理.编译.测试.打包,部署. 2. 生命周期详解 2.1 三套生命周期 2.1.1 clean生命周期 pre-clean:清理前的准 ...

最新文章

  1. oppo怎么广告接入_OPPO游戏的承转启合,携手开发者迎接万物互融时代
  2. Javascript模块化编程(一):模块的写法
  3. Linux 操作系统原理 — 系统结构
  4. getParameter的用法总结
  5. 【模型解读】pooling去哪儿了?
  6. python中怎么取两个列表 集合的交集
  7. 数学公式编辑器 linux,linux下的公式编辑器
  8. Fish Shell 使用笔记
  9. Day07-函数(2)
  10. 乐高ev3搭建图_乐高EV3机械爪合集
  11. 游戏开发中常用的设计模式
  12. Ubuntu下配置JDK
  13. php 字符串固定长度,不够补充其他字符串
  14. 计算机换算单位 gb,gb和mb的换算-KB,MB,GB之间的换算关系
  15. 计算机启动应用程序的方法,应用程序无法正常启动,教您应用程序无法正常启动的解决方法...
  16. 哲理故事与管理之道 14 如何留住员工
  17. 温度传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. 2023年湖北武汉中级工程师怎么申请?申报渠道有哪些?启程别
  19. HDOJ - 2371 矩阵乘法
  20. 联合证券|内外利好共振 今年A股可更乐观一点

热门文章

  1. Dependency Walker使用说明[转]
  2. Regex.Match 方法
  3. 虚拟主机中,不修改IIS设置,在IIS6下运行MVC架构的网站
  4. 京东投票项目开发笔记
  5. CPPUnit 测试宏
  6. 查看端口命令及端口功能详解
  7. 从R-CNN到Faster R-CNN漫谈
  8. c# mysql 连接串_c# – 如何形成一个正确的MySQL连接字符串?
  9. mysql-mmm_MySQL-MMM高可用群集
  10. add(1)(2)(3) add(1,2)(3)