【Maven三】——maven生命周期和插件

news/2024/4/28 16:09:52/文章来源:https://blog.csdn.net/wangwei021933/article/details/131739391

系列文章目录

Maven之POM介绍
maven命令上传jar包到nexus
【Maven二】——maven仓库


maven生命周期和插件

  • 系列文章目录
  • 前言
  • 一、什么是生命周期&why
    • 1.三套生命周期
    • 2.clean生命周期
    • 3.default生命周期
    • 4.site生命周期
    • 5.命令行与生命周期
  • 二、插件目标
  • 三、插件绑定
    • 1.内置绑定
    • 2.自定义绑定
  • 四、插件配置
    • 1.命令行插件配置
    • 2.POM中插件全局配置
    • 3. POM中插件任务配置
  • 五、获取插件信息
  • 六、命令行调用插件
  • 总结


前言

由于在具体项目开发过程中对于maven的理解和掌握处于基本运用的阶段,了解maven过于片面,所以本篇博客是博主学习《maven实战》书籍之后对maven生命周期和插件的总结,绝大多数内容源于《maven》实战这本书籍。


在这里插入图片描述

一、什么是生命周期&why

maven的生命周期是为了对所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成几乎所有构建步骤。
几乎所有项目的构建,都能够映射到这样一个生命周期上。

1.三套生命周期

maven拥有三套相互独立的生命周期,它们分别是clean、default、和site
clean 生命周期的目的是清理项目
default 生命周期的目的是构建项目
site 生命周期的目的是建立项目站点

每一个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
以clean生命周期为例,它包含的阶段有pre-clean,clean和post-clean。当用户调用pre-clean的时候,之后又pre-clean阶段执行;当用户调用clean的时候,pre-clean和clean阶段都会得以顺序执行,相应用户调用post-clean的时候,pre-clean,clean和post-clean会得以顺序执行。

2.clean生命周期

clean生命周期的目的是清理项目,它包含三个阶段
1.pre-clean执行一些清理前需要完成的工作
2.clean清理上一次构建生成的文件
3.post-clean执行一些清理后需要完成的工作

3.default生命周期

default生命周期定义了真正构建时需要执行的所有步骤,是所有生命周期中最核心的部分。
下面列出重要的阶段:

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources处理项目主资源文件,一般是对src/main/resources目录内容进行变量替换等工作之后,复制到项目输出的classpath目录中
  5. generate-resources
  6. process-resources
  7. compile编译项目的主源码,一般是编译src/main/java目录下的Java文件值输出的主classpath目录中
  8. process-classes
  9. generate-test-sources
  10. process-test-sources处理项目测试资源文件,一般是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath中。
  11. generate-test-resources
  12. process-test-resources
  13. test-compile编译项目的测试代码。一般是编译src/test/java目录中java文件至项目输出的测试classpath目录中
  14. process-test-classes
  15. test使用单元测试框架测试,测试代码不会被打包或部署
  16. prepare-package
  17. package接受编译好的代码,打包成可发布的格式,如jar
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install将包安装到maven仓库,共本地其他maven项目使用
  23. deploy将最终的包复制到远程仓库,供其他开发人员和项目使用
    上述可以参考官方的解释:http://maven.apach.org/guides/introduction/introduction-to-the-lifecycle.html

4.site生命周期

site生命周期的目的是建立和发布项目站点,maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息
pre-site执行一些在生成项目站点之前需要完成的工作
site生成项目站点文档
post-site执行一些在生成项目攒点之后需要完成的工作
site-deploy将生成的站点发布到服务器上。

5.命令行与生命周期

从命令行执行Maven任务的主要方式就是调用maven的生命周期阶段。需要注意的是每个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。

下面以一些常见的maven命令为例,解释其执行的生命周期阶段。

mvn clean:该命令调用clean生命周期的test阶段,实际执行的阶段为clean生命周期的pre-clean和clean阶段

mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段
以及default生命周期的从validate至install的所有阶段。

mvn clean deploy site-deploy:该命令调用clean生命周期的clean阶段和default生命周期的deploy阶段以及site生命周期的site-deploy阶段。
实际执行的阶段为clean生命周期的pre-clean和clean阶段
以及default生命周期的所有阶段,以及site生命周期的所有阶段。

二、插件目标

maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的。
对于插件本身,为了能够复用代码,它往往能够完成多个任务。
例如maven-dependency-plugin,他能基于项目依赖做很多事。它能够分析项目依赖,帮助找出潜在的无用依赖;他能够列出项目的依赖树,帮助分析依赖的来源;等等。
为每个这样的功能编写一个独立的插件显然是不可取的,因为这些任务背后有很多可以复用的代码,因此这些功能聚集在一个插件里,每个功能就是一个插件目标。

maven-dependency-plugin有十多个目标,每个目标对应了一个功能,上述提到的几个功能分别对应插件目标为dependency-analyze、dependency:tree等等。
这是一种通用的写法,冒号前面是插件前缀,冒号后面是该插件的目标。

三、插件绑定

maven的生命周期与插件相互绑定,用于完成实际的构建任务。例如项目编译这一任务,它对应了default生命周期的compile这一阶段,而maven-compiler-plugin插件的compile目标能够完成该项任务,因此将他们绑定,就能实现项目编译的目的。

如图:
在这里插入图片描述

1.内置绑定

为了让用户几乎不用任何配置就能够构建maven项目,maven在核心为一些主要的生命周期阶段绑定了很多插件的目标。当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。

如clean生命周期有pre-clean、clean、post-clean三个阶段,其中clean与maven-clean-plugin:clean绑定。maven-clean-plugin仅有clean这一个目标,其作用就是删除项目的输出目录。
在这里插入图片描述
site生命周期有pre-site site post-site site-deploy四个阶段,其中site和maven-site-plugin:site相互绑定,site-deploy和maven-site-plugin:deploy相互绑定。maven-site-plugin有很多目标,其中site目标用来生成项目站点,deploy目标用来将项目站点部署到远程服务器上。
site生命周期阶段与插件目标的绑定关系如图:
在这里插入图片描述default生命周期的内置插件绑定关系及具体任务如图:
只列出了拥有插件绑定关系的阶段,default生命周期还有很多阶段,默认它们没有绑定任何插件。
在这里插入图片描述

2.自定义绑定

除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段,这种自定义绑定方式能让maven项目在构建过程中执行更多富有特色的任务。这里不做描述。

四、插件配置

完成了插件和生命周期的绑定之后,用户还可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求。几乎所有maven插件的目标都有一些可配置的参数,用户可以通过命令行和POM等方式来配置这些参数。

1.命令行插件配置

示例:
用户可以在maven命令中使用-D参数,并伴随一个参数键=参数值的形式,类配置插件目标的参数。
例如:maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会跳过执行测试。
如:mven install -Dmaven.test.skip=true
参数-D是java自带的,其功能是通过命令行设置一个Java系统属性,maven简单地重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置。

2.POM中插件全局配置

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

用户可以在声明插件的时候,对此插件进行一个全局配置。那么所有基于该插件目标的任务,都会使用这些配置。
例如:我们通常会需要配置maven-compiler-plugin告诉他编译java1.5版本的源文件,生成与JVM1.5兼容的字节码文件。
如:
在这里插入图片描述
这样不管绑定到compile阶段的maven-compiler-plugin:compiler任务还是绑定到test-compiler阶段的maven-compiler-plugin:testCompiler任务,就都能使用该配置,基于java1.5版本进行编译。

3. POM中插件任务配置

除了为插件配置全局的参数,用户还可以为某个插件任务配置特定参数。
以maven-antrun-plugin为例,他有一个目标run,可以用来在Maven中调用Ant任务。用户将maven-antrun-plugin:run绑定到多个生命周期阶段上,再加以不同的配置,就可以
让maven在不同的生命阶段执行不同的任务。
在这里插入图片描述
上述代码中,首先,maven-antrun-plugin:run与vailate阶段绑定,从而构成一个id为ant-validate的任务。插件全局配置中的configuration元素谓语plugin元素下面,这里的configuration远足则谓语execution元素下,表示这是特定任务的配置。而非插件整体的配置
这个ant-validate任务配置了一个echo Ant任务,向命令行输出一段文字,表示该任务是绑定到validate阶段的。第二个任务的id为ant-verify,它绑定到了verify阶段,同样他也输出一段文字到命令行,告诉该任务绑定到了verify阶段。

五、获取插件信息

仅仅理解如何配置使用插件是不够的,当遇到一个构建任务的时候,用户还需要知道去哪里寻找合适的插件,以帮助完成任务。找到正确插件之后,还要详细了解该插件的配置点。
由于maven的插件非常多,而且这其中的大部分没有完善问的文档,因此,使用正确的插件并进行正确的配置,不是一件容易的事。

我们主要可以通过两种方式获取插件信息:

  1. 在线插件信息
    所有主要的maven插件都来自Apache和Codehaus。
    插件的详细列表可以访问地址:http://maven.apache.org/plugins/index.html
    插件下载地址:Central Repository: org/apache/maven/plugins

  2. 使用maven-help-plugin描述插件
    除了访问在线的插件文档之外,可以借助maven-help-plugin来获取插件的详细信息。
    如:运行如下命令来获取maven-compiler-0plugin2.1版本的信息:
    mvn help:describle-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
    这是执行的是maven-help-plugin的describe目标,在参数plugin中输入需要描述插件的groupId、artifactId、version。

六、命令行调用插件

在命令输入mvn-h 显示mvn命令帮助,显示如下信息:
在这里插入图片描述
mvn命令的基本用法,options表示可用选项,mvm命令有20多个选项,除了选项之外,mvn命令后面可以添加一个或者多个goal和phase,分别指插件目标和生命周期阶段。

我们知道,可以通过mvn命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标。
但maven还支持直接从命令行调用插件目标。maven支持这种方式是因为有些任务不适合绑定在生命周期上,例如maven-help-plugin:describe,我们不需要在构建项目的时候去描述插件信息,又如maven-dependency=plugin:tree,我们也不需要构建项目显示依赖树。

因此这些插件目标应该通过如下方式使用:
mvn help:describe-Dplugin-compiler
mvn dependency:tree

这里需要注意的是,describe是maven-help-plugin的目标没错,但是冒号前的help是什么?
它既不是groupId、也不是artifactId,maven是如何根据该信息找到对应版本插件的呢?
先看如下命令:
在这里插入图片描述
他们的效果与之前的两条命令基本一样,但是前面的命令更为简洁,更容易记忆和使用。

为了达到该目的,maven引入了目标前缀的概念,help是maven-help-plugin的目标前缀。
dependency是maven-dependency-plugin的前缀,有了插件前缀maven就能找到对应的artifactId,不过除了artifactId,maven还需要得到groupId和version才能精确定位到某个插件。

总结

认识和理解maven的生命周期,以及为什么要有maven的生命周期对于maven的生命周期的运用有很大的帮助。
maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的。
对于插件本身,为了能够复用代码,它往往能够完成多个任务,通过填写不同参数完成不同的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将媒体公司资产迁移到 Amazon S3 的技术方案

随着媒体公司的发展,他们在仓库中积累了大量的旧磁带和未数字化的视频。这些资产可能很有价值,但以目前的形式很难访问和货币化。此外,将这些资产存储在仓库中既有风险又昂贵。 媒体企业可以通过将其资产迁移到云存储来解决这些问题&#xf…

【C++】面试基础搬运

c/c c三大特性 封装 最开始接触代码是C语言,那么开始写一些逻辑代码的时候会很麻烦,因为你要在函数中定义变量,然后按顺序写对应的逻辑,接着可以将逻辑封装成函数。当时会感觉很麻烦,因为很散装,知道后面…

Nacos报错Could not resolve placeholder ‘order.name‘ in value “${order.name}“怎么解决?

出现这个原因有两个: 1.首先在Nacos配置中心,写入yml配置文件的数据和后端服务在取数据的时候名称不一致 如下图,现在我的配置中心为order-service 看看其中的文件内容信息: 再看看后端是怎么取的: 看出上面错误了吗…

C# IEnumerator 用法

一、概述 IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是 System.Collections.Generic.IEnumerator<T> 接口。 C# 语言的 foreach 语句&#xff08;在 Visual Basic 中为 for each&#xff09;隐藏了枚举数的复杂性。 因此&#xff0c;建议使用 foreach 而不…

[每周一更]-(第54期):Go的多版本管理工具

参考 https://zhuanlan.zhihu.com/p/611253641https://learnku.com/articles/78326 前文概要 Go语言从开始使用从1.13起步&#xff0c;随着泛型的支持&#xff0c;带领团队在转型Go的时候&#xff0c;做基础组件架构选型使用1.18&#xff0c;但是Go版本不断迭代想使用最新版本…

3Ds max入门教程:创建尼亚加拉大瀑布模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 初学者在3ds Max中为尼亚加拉大瀑布建模 这次您将学习通过几个简单的步骤在3ds max中对尼亚加拉大瀑布&#xff08;从远处看起来很逼真&#xff09;进行建模。所以&#xff0c;让我们开始吧&#xff01; …

Flutter:EasyLoading(loading加载、消息提示)

前言 官方虽然提供了内置的加载指示器和提示信息&#xff0c;但是功能比较简陋&#xff0c;这里推荐&#xff1a;flutter_easyloading CircularProgressIndicator CircularProgressIndicator()加粗样式 ScaffoldMessenger.of(context).showSnackBar(const SnackBar(// 提示…

怎么用电脑做动图?常见动图的制作方法

常见的gif图片有两种&#xff0c;一种是通过gif合成功能制作&#xff0c;另一种是由视频转gif动图&#xff0c;那么对于日常不是专业设计出身的小伙伴&#xff0c;该使用什么样的gif制作功能&#xff0c;能够满足两种动图制作呢&#xff1f;下面这款gif制作器&#xff08;https…

UE4 常用控制台命令

ue4执行控制台命令有两种方式&#xff0c;一是在运行时按~呼出控制台输入命令后回车执行&#xff0c;二是调用蓝图函数ExecuteConsoleCommand函数传入参数执行命令&#xff0c;需要注意shipping包无法执行控制台命令 常用命令&#xff1a; Stat FPS 显示帧率 Stat Slate 显示…

快速而简单的视频格式转换方法

在数字时代&#xff0c;我们经常需要将视频文件从一种格式转换为另一种格式。无论是因为兼容性问题&#xff0c;还是为了在特定设备上播放视频&#xff0c;视频格式转换是一项非常常见的任务。本文将介绍视频格式转换的基本知识和步骤。 首先&#xff0c;了解不同的视频格式非常…

【数据结构】之红黑树

红黑树 红黑树的概念红黑树的性质红黑树的插入操作&#xff08;核心&#xff09;情况一&#xff1a;uncle存在且为红情况二&#xff1a;uncle不存在/存在且为黑&#xff08;在同一侧&#xff09;情况三&#xff1a;uncle不存在/存在且为黑&#xff08;在两侧&#xff09;总结 红…

03插值与拟合

9.已知飞机下轮廓线上数据如下&#xff0c;分别用分段线性插值和三次样条插值求x每改变0.1时的y值。 x035791112131415y01.21.72.02.12.01.81.21.01.6 %9.已知飞机下轮廓线上数据如下&#xff0c;分别用分段线性插值和三次样条插值求每改变0.1时的y值。x [0 3 5 7 9 11 12 1…

简单工厂模式详解

文章目录 前言一、简单工厂模式定义二、举个例子三、简单工厂模式的缺点总结 前言 本篇我们了解一下简单工厂模式&#xff0c;它是设计模式的雏形&#xff0c;是学习设计模式的开端&#xff0c;我会结合案例说明它的设计思路。 一、简单工厂模式定义 简单工厂模式并不是GoF23…

【运维工程师学习五】数据库之MariaDB

【运维工程师学习五】数据库 1、常用的关系型数据库2、C/S结构3、MariaDB图形客户端4、安装MariaDB5、启动MariaDB及验证启动是否成功6、验证启动——端口7、验证启动——进程8、MariaDB配置文件路径主配置文件解读&#xff1a; 9、MariaDB的配置选项10、MariaDB客户端连接1、在…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联&#xff0c;本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络&#xff0c;通过mac地址互通&#xff0c;不通过路由互通。跨子网&#x…

微信小程序安装和使用 Vant Weapp 组件库

微信小程序安装和使用 Vant Weapp 组件库 1. Vant Weapp 介绍2. Vant Weapp 的 安装2.1. 通过npm安装2.2. 构建npm2.3. 修改 app.json2.4. 修改 project.congfig.json2.5. 测试一下&#xff0c;使用Vant Weapp提供的组件 1. Vant Weapp 介绍 Vant 是一个轻量、可靠的移动端组件…

Three.js环境光,平行光,点光源,聚光灯的创建和灯光辅助线的使用

Three.js中的灯光API使用 1.环境光&#xff08;AmbientLight&#xff09;2.平行光&#xff08;directionalLight&#xff09;3.PointLight(点光源) 4.聚光灯&#xff08;SpotLight&#xff09;5.材质平面&#xff08;PlaneGeometry&#xff09;用于接收&#xff08;平行光和聚…

JavaWeb项目【SpringBoot】——图书项目4.0【源码】:SpringBoot版本 springboot相关技术 项目应用

目录 项目简介思考 & 改进1.Jsp都是同步请求---->改成异步Ajax【完成】2.前端用Jsp技术落后----->用Vue框架【完成】3.架构问题&#xff1a;配置数据和Java代码耦合【完成】3.SQL语句和Java代码耦合【完成】4.架构问题&#xff1a;servlet只能处理一个请求5.响应方式…

[论文分享]MR-MAE:重构前的模拟:用特征模拟增强屏蔽自动编码器

论文题目&#xff1a;Mimic before Reconstruct: Enhancing Masked Autoencoders with Feature Mimicking 论文地址&#xff1a;https://arxiv.org/abs/2303.05475 代码地址&#xff1a;https://github.com/Alpha-VL/ConvMAE&#xff08;好像并未更新为MR-MAE模型&#xff09; …

从Vue2到Vue3【零】——Vue3简介及创建

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介及创建 文章目录 系列文章目录前言一、Vue3的发布带来了什么1.1 性能提升1.2 源码升级1.3 支持TypeScript1.4 新特性 二、创建Vue3.0工程2.1 什么是Vite2.2 利用Vite创建Vue3.0工程2.3 利用vue-cli脚手架创建Vue3.0工程 三、 …