Maven的生命周期详解

news2024/10/7 6:45:09

目录

    • 一、生命周期(clean+site+default)
      • 1、生命周期与插件的关系
      • 2、maven的三套生命周期
      • 3、生命周期执行规则
    • 二、Maven插件(plugin)
      • 1、两种类型的插件
      • 2、调用插件有两种方式
      • 3、内置绑定
      • 4、自定义绑定插件
    • 三、官网查找插件

本篇文章重点针对这几个问题进行讲解:

  • maven的生命周期都有哪些阶段?
  • maven的生命周期和插件到低有什么关联?
  • 插件和插件的目标有什么关联?
  • 假如我们要用某个插件,怎么上官网查找?
  • 怎么手动调用插件?

一、生命周期(clean+site+default)

在 Maven 出现之前,项目构建的生命周期就已经存在,开发人员每天都在对项目进行清理,编译,测试及部署,但由于没有统一的规范,不同公司甚至不同项目之间的构建的方式都不尽相同。

Maven 从大量项目和构建工具中学习和反思,最后总结了一套高度完美的,易扩展的生命周期。这个生命周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。

1、生命周期与插件的关系

Maven 生命周期是抽象的,其本身不能做任何实际工作,这些实际工作(如源代码编译)都通过调用 Maven 插件 中的插件目标(plugin goal)完成的。

为了更好的理解 Maven 生命周期、插件以及插件目标三者的关系,我们可以将 Maven 生命周期理解成一个抽象父类将插件理解成其子类将插件目标理解成子类中重写的方法,其基本结构与下面的示例代码相似。

/**
* 模拟 maven 生命周期
*/
public abstract class LifeCycle {
    //定义构建过程
    public void build() {
        //模拟生命周期各个阶段,即调用插件中目标
        clean();
        initialize();
        compile();
        packager();
        install();
    }

    //定义清理的过程
    public abstract void clean();

    //定义初始化的过程
    public abstract void initialize();

    //定义编译的过程
    public abstract void compile();

    //定义打包的过程
    public abstract void packager();

    //定义安装的过程
    public abstract void install();
}

模拟 clean 插件的子类,代码如下。

/**
* 子类模拟clean 相关的插件
*/
public abstract class CleanPlugin extends LifeCycle {
    //重写父类(生命周期)的清理工作
    //模拟插件目标
    @Override
    public void clean() {
        System.out.println("清理");
    }
}

以上示例中,父类 LifeCycle 模拟的是 Maven 生命周期,子类 CleanPlugin 模拟的是 Maven 插件,而子类中重写的 clean() 模拟的是插件目标。插件的本意就是插拔式的,用了添加不用不添加。

虽然示例中的代码与 Maven 实际代码相去甚远,但它们的基本理念是方法相同的。生命周期抽象了构建的各个步骤,定义了它们的执行顺序,但却没有提供具体的实现。插件中完成了对构建过程的实现,想要完成某个构建步骤,调用插件中的一个或多个插件目标即可。

2、maven的三套生命周期

Maven 的生命周期并非只有一套,而是有三套,并且这三套生命周期之间是没有关系的。一套生命周期包含很多个不同的阶段,这些不同的阶段是有顺序的,有些阶段必须要在某个阶段完成之后,才能进行。Maven 的三套生命周期分别为:clean(清理),default(默认),site(站点)。接下来我们就一一介绍一下这三个生命周期。

clean:用于清理项目,clean 生命周期包括以下 3 个阶段:

  1. pre-clean: 清理前的准备工作;
  2. clean:清理上一次构建的结果;
  3. post-clean:清理结束后需要完成的工作。

default:default 生命周期定义了项目真正构建时所需要的所有步骤,它是所有生命周期中最核心,最重要的部分。

default 生命周期包含非常多的阶段,如下表:

site:sit 生命周期的目的是建立和部署项目站点,Maven 能够根据 POM 包含的信息,自动生成一个友好的站点,该站点包含一些与该项目相关的文档。

site 生命周期包含以下 4 个阶段:

  1. pre-site:准备阶段。在生成站点前所需要做的工作;
  2. site:生成站点阶段;
  3. post-site:结束阶段。生成站点结束后所需要做的工作;
  4. site-deploy:发布阶段。我们可以将上面生成的站点发布到对应服务器中。

3、生命周期执行规则

每套生命周期包含一系列的构建阶段(phase),这些阶段是有顺序的,且后面的阶段依赖于前面的阶段。用户与 Maven 最直接的交互方式就是调用这些生命周期阶段。

以 clean 生命周期为例,它包含 pre-clean、clean 以及 post-clean 三个阶段,当用户调用 pre-clean 阶段时,则只有 pre-clean 阶段执行;当用户调用 clean 阶段时,pre-clean 和 clean 阶段都会执行。当用户调用 post-clean 阶段时,则 pre-clean、clean 以及 post-clean 三个阶段都会执行。

三套生命周期本身是相互独立的,用户可以只调用 clean 生命周期的某个阶段,也可以只调用 default 生命周期的某个阶段,而不会对其他生命周期造成任何影响。当然也可以同时调用两套生命周期的某个阶段。

通过将阶段名传递给 mvn 命令,就可以调用构建阶段,例如:
mvn clean,就是调用clean生命周期的clean阶段,当前项目的target目录会被清空。

我们试着执行 Maven 的打包命令:mvn package -DskipTests(-DskipTests是跳过测试的意思,假如不跳过测试,他在打包的时候会自动执行项目test目录下带有@Test注解的方法)。就是调用default生命周期的package 阶段,执行完成之后,可以看到其所经过的生命周期。因此,当我们想要构建项目的时候,并不需要分别执行 package 阶段之前的阶段,而是 Maven 自动为我们执行。突然发现,原来构建项目是如此的简单,方便。

生命周期中的每个构建过程都可以绑定一个或多个插件目标,且 Maven 为大多数的构建步骤都绑定了默认的插件。例如,针对源代码编译的插件是 maven-compiler-plugin、针对集成测试的插件是 maven-surefire-plugin 等(关于这一点后面会细说)。

同时我们也可以执行两套生命周期,例如调用clean生命周期的clean阶段再加上default生命周期的package阶段:mvn clean package -DskipTests

二、Maven插件(plugin)

1、两种类型的插件

Maven 实际上是一个依赖插件执行的框架,它执行的每个任务实际上都由插件完成的。使用Maven打出来的包并不包含任何 Maven 插件,它们以独立构件的形式存在, 只有在 Maven 需要使用某个插件时,才会去仓库中下载。

如下表所示,Maven 提供了如下 2 种类型的插件:

2、调用插件有两种方式

插件目标: 对于 Maven 插件而言,为了提高代码的复用性,通常一个 Maven 插件能够实现多个功能,每一个功能都是一个插件目标,即 Maven 插件是插件目标的集合。我们可以把插件理解为一个类,而插件目标是类中的方法,调用插件目标就能实现对应的功能。

使用的两种方式:

  1. 引入到项目当中,然后将插件绑定到指定的生命周期,然后执行声明周期命令会自动调用该插件,例如:mvn clean、mvn install
  2. 通过如下命令可以直接调用插件。
    • 使用 Maven 命令执行插件的目标,语法如:mvn [插件名]:[目标名]
    • 例如,调用 maven-compiler-plugin 插件的 compile 目标,命令如:mvn compiler:compile(注意不能使用插件的全名,一定是缩写名,不然会报找不到插件)

插件绑定: 为了完成某个具体的构建任务,Maven 生命周期的阶段需要和 Maven 插件的目标相互绑定。例如,代码编译任务对应了default 生命周期的 compile 阶段,而 maven-compiler-plugin 插件的 compile 目标能够完成这个任务,因此将它们进行绑定就能达到代码编译的目的。

3、内置绑定

Maven 默认为一些核心的生命周期阶段绑定了插件目标,当用户调用这些阶段时,对应的插件目标就会自动执行相应的任务。

表中,default 生命周期中只列出了绑定了插件目标的阶段,它还有很多其他的阶段,但这些阶段默认没有绑定任何插件目标,因此它们也没有任何实际的行为。

在这里插入图片描述

我们可以直接在执行 Maven 命令看到该构建过程包含了哪些插件目标。例如,在 Maven 项目中执行 mvn clean install 命令,能看到如下输出,图中标记的部分就是执行此命令时所调用的插件目标。

像这些内置绑定的插件我们也可以在项目当中去显示的声明然后修改配置,这时候内置绑定插件的默认配置将会被覆盖!

4、自定义绑定插件

除了内置绑定之外,用户也可以自己选择将某个插件目标绑定到 Maven 生命周期的某个阶段上,这种绑定方式就是自定义绑定。自定义绑定能够让 Maven 在构建过程中执行更多更丰富的任务。

例如,我们想要在 clean 生命周期的 clean 阶段中显示自定义文本信息,则只需要在项目的 POM 中 ,通过 build 元素的子元素 plugins,将 maven-antrun-plugin插件的run 目标绑定到 clean 阶段上,并使用该插件输出自定义文本信息即可。

<build>
	<plugins>
        <!-- 绑定插件 maven-antrun-plugin -->
        <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>3.0.0</version>
              <executions>
                  <execution>
                    <!--自定义 id -->
                    <id>custom clean</id>
                    <!--插件目标绑定的构建阶段 -->
                    <phase>clean</phase>
                    <!--插件目标 -->
                    <goals>
                    	<goal>run</goal>
                    </goals>
                    <!--配置 -->
                    <configuration>
                      	<!-- 执行的任务 -->
                    	<target>
                        	<!--自定义文本信息 -->
                        	<echo message="清理阶段"/>
                      </target>
                    </configuration>
                  </execution>
              </executions>
          </plugin>
	</plugins>
</build>

以上配置中除了插件的坐标信息之外,还通过 executions 元素定义了一些执行配置。executions 下的每一个 executin 子元素都可以用来配置执行一个任务。execution 下各个元素含义如下:

  • id:任务的唯一标识。
  • phase:插件目标需要绑定的生命周期阶段。
  • goals:用于指定一组插件目标,其子元素 goal 用于指定一个插件目标。
  • configuration:该任务的配置,其子元素 tasks 用于指定该插件目标执行的任务。

执行命令 mvn clean ,结果如下:

以上我们只是简单使用maven-antrun-plugin插件的run目标绑定到了clean阶段打印了一段文字,实际我们还可以通过该插件来完成一些特殊工作,例如打包过后自动将包上传到指定位置等等…这里就不细说了。

插件的运行顺序: 当插件目标绑定到生命周期的不同阶段时,其执行顺序由生命周期阶段的先后顺序决定。如果多个目标绑定到同一个生命周期阶段,其执行顺序与插件声明顺序一致,先声明的先执行,后声明的后执行。

三、官网查找插件

官网:https://maven.apache.org/plugins/index.html

这里就拿maven-antrun-plugin插件来说,首先打开官网然后搜索antrun,如下:

点击antrun进来以后看到如下:

点击目标进来以后可以看到该插件可配置的标签:

注意:光看标签有时候根本不知道怎么用,尽量配合着用法示例来使用。

点击Using <target/> Attributes用法示例如下:

并不是所有的插件都是maven开发的,还有一些其他公司进行开发的,如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Go专家编程(第2版)》书评

首先感谢官方的肯定&#xff0c;让我在【图书活动第四期】的活动中获得了《Go专家编程(第2版)》这本书&#xff0c;以下是从我的观点对这本书的书评 文章目录 前言书籍部分读者评价总结 前言 很高兴有机会写一篇关于《Go专家编程&#xff08;第2版&#xff09;》的书评。大致读…

Scrum进入疲惫期?三点帮你走出困境

《敏捷软件开发》中提到&#xff1a;“Scrum可以帮助团队更好地应对变化和不确定性&#xff0c;以及更快地响应客户需求。通过持续的反馈和改进&#xff0c;Scrum可以提高团队的适应性和灵活性。” 然而&#xff0c;有些团队在使用Scrum后&#xff0c;却出现了工作任务越来越多…

在线搭建产品FAQ常用问题的网页Tips清单

在线搭建产品FAQ&#xff08;常见问题解答&#xff09;页面&#xff0c;是现代企业建立客户服务体系中的重要组成部分&#xff0c;旨在通过提供问题解答&#xff0c;为客户提供更好的用户体验。 在线搭建产品FAQ网页的常用Tips清单&#xff1a; 确定FAQ的主题和范围 在创建FAQ…

c# 自定义安装程序路径(设置安装路径多一层目录)+卸载前执行操作

打包成setup.exe的完整流程可以参考&#xff1a;将WinForm项目打包成exe安装包&#xff0c;并创建快捷方式 (vs2019)_winform发布成exe-CSDN博客 以下内容默认大家已经知道打包的完整流程。 一、自定义安装目录 真的好讨厌安装程序直接安装到选择的路径&#xff0c;不新建目录…

【006】C++数据类型之进制间的转换

C数据类型之进制间的转换 引言一、进制的概述二、十进制转二进制、八进制、十六进制&#xff08;短除法&#xff09;三、二进制、八进制、十六进制转十进制&#xff08;位次幂&#xff09;四、其他进制间的转换4.1、二进制转八进制4.2、二进制转十六进制4.3、八进制转二进制4.4…

Ubuntu18.04+Xenomai-3.2.1下安装igH EtherCAT Master

一、安装Xenomai-3.2.1 Ubuntu18.04安装Xenomai实时内核https://blog.csdn.net/m0_56451176/article/details/130608887?spm=1001.2014.3001.5501 二、安装igH EtherCAT Master 2.1安装所需工具 sudo apt install autoconf autogen libtool 2.2下载IgH源码 EtherCAT安装…

赤道Kelvin和Rossby波 Part-1(简要介绍)

Equatorial Kelvin and Rossby Waves 赤道Kelvin和Rossby波&#xff1b;在该部分简要介绍 Kelvin waves和Rossby waves是海洋对西风突发等外界作用力变化的调整方式。这种调整是通过受重力、科氏力f以及科氏力的南北变化 ∂ f / ∂ y β \partial f/\partial yβ ∂f/∂yβ影响…

基于脑功能连接模式解码六种基本情绪

近日&#xff0c;北京大学心理认知与科学学院、IDG麦戈文脑科学研究所方方课题组&#xff0c;在《Science China Life Sciences》 在线发表了题为“Decoding six basic emotions from brain functional connectivity patterns”的研究论文。该工作结合滑窗技术和随机森林模型&a…

为了流量,何同学做了个“假B站”?

何同学是B站知名数码博主&#xff0c;凭借优秀的视频制作能力&#xff0c;内容创新获得广大年轻用户的喜欢。 2021年的时候&#xff0c;UP主老师好我叫何同学就发布了一条制作AirDesk的视频&#xff0c;随后迅速在社交媒体中引发了大量关注。 当时&#xff0c;该视频为B站全站…

ROS:launch文件加载:已有地图(yaml)、rviz、turtlebot3模型、gazebo模型、move_base、amcl

一.下载turtlebot3、建立地图文件yaml和pgm ROS&#xff1a;gazebo创建仿真地图&#xff0c;turtlebot3加载仿真地图进行建图&#xff0c;生成yaml和pgm地图信息_Charlesffff的博客-CSDN博客 二.创建目录 其中amcl.launch和move_base.launch目录在turtlebot3中&#xff1a; 其…

把二叉搜索树转换为累加树

1题目 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件…

jpg怎么转换成png格式?四种转换方式试试看

很多时候&#xff0c;我们需要将JPG&#xff08;Joint Photographic Experts Group&#xff09;格式转换成PNG&#xff08;Portable Network Graphics&#xff09;格式&#xff0c;从而便于图片的使用。那么&#xff0c;将JPG转换成PNG有什么作用呢&#xff1f;首先&#xff0c…

【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。

文章目录 一、题目二、解答&#xff1a;迭代法&#xff0c;引入一个新的头结点三、难点解释 【LeetCode】203&#xff0c;移除链表元素。 难度等级&#xff1a;简单。 本题是链表入门题目&#xff0c;值得深入研究。 一、题目 二、解答&#xff1a;迭代法&#xff0c;引入一个…

Kali-linux使用SET实施攻击

前面介绍了社会工程学工具包&#xff08;SET&#xff09;的简单使用。为了能帮助用户更容易的理解社会工程学的强大功能。本节将介绍使用社会工程学工具包实施各种攻击。 7.4.1 针对性钓鱼攻击向量 针对性钓鱼攻击向量通过构造特殊文件格式的漏洞进行渗透攻击&#xff0c;如利…

python实现神经网络之---构建神经元模型1(python3.7)

本文主要要以周志华的机器学习书为蓝本编写 第5章神经网络 5.1python 实现神经元模型 神经网络中最基本的成分是神经元 (neuro且)模型&#xff0c;如下图所示&#xff1a; 1943 年&#xff0c; [McCulloch and Pitts, 1943] 将上述情形抽象为国 5.1所示的简单模型&#xff0c…

全球分布式云大会:AntDB超融合流式实时数仓,打造分布式数据库新纪元

日前&#xff0c;全球分布式云大会北京站在北京金茂万丽酒店举办&#xff0c;亚信科技AntDB数据库受邀参会&#xff0c;会上技术负责人北陌发表以“AntDB超融合流式实时数仓&#xff0c;打造分布式数据库新纪元”为主题的演讲&#xff0c;通过分享AntDB在数据库前沿技术的研发实…

打印菱形(两种思路)

一、输入的行数等于上半部分的金字塔行数 思路&#xff1a; 仔细观察图形&#xff0c;可以发现&#xff0c;此图形中是由空格和*按照不同个数的输出组成的。 上三角&#xff1a;先输出空格&#xff0c;后输出*&#xff0c;每行中空格&#xff1a;从上往下&#xff0c;一行减少一…

国外各大学和学院对于ChatGPT使用立场总结

ChatGPT和生成式AI的快速普及对教育这个专业领域带来了威胁——全国各地的大学和学院都召开了紧急会议&#xff0c;讨论如何应对学生利用AI作弊的风险。 一部分学校和教授担心这项技术会成为学生在论文或其他写作作业和考试中寻求捷径的工具。而这种生成内容的方式往往能够绕开…

Deepstream使用Rabbitmq 和kafka发送消息(天坑)unable to connect to broker library

连接服务器失败&#xff0c;要么是是本地参数没设对, 要么服务器没开&#xff01; 使用Kafka发送消息好搞&#xff0c;按照 /opt/nvidia/deepstream/deepstream-6.2/sources/libs/kafka_protocol_adaptor/README 一步一步来就行了&#xff0c;前提是要搞kafka 环境搭建开启&am…

特殊区域在OSPF协议中的分析

我们都知道OSPF路由器协议是基于SPF算法计算最优路径&#xff0c;当用于SPF算法的LSDB的越大&#xff0c;那么路由器的计算压力就越大&#xff0c;对于一些性能不佳的OSPF路由器来说&#xff0c;如何尽可能的减小LSDB规模也就成了OSPF设计时要考虑到的问题&#xff0c;为了进一…