Maven的仓库、周期和插件

news2024/11/18 17:20:59

优质博文:IT-BLOG-CN

一、简介

随着各公司的Java项目入库方式由老的Ant改为Maven后,相信大家对Maven已经有了个基本的熟悉。但是在实际的使用、入库过程中,笔者发现挺多人对Maven的一些基本知识还缺乏了解,因此在此处跟大家简单地聊下Maven的相关内容,为Maven的仓库、生命周期及插件。

二、Maven仓库

在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构建。Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。任何的构件都有唯一的坐标,即groupId、artifactId、version组成的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路很,

即:
1.基于groupId准备路很,将句点分隔符转成路很分隔符,就是将"." 转换成"/",如com.erayt.solar ->com/erayt/solar;
2.基于artifactId准备路很,将artifactId连接到后面:com/erayt/solar/solar.core;
3.使用version准备路很,将version连接到后面:com/erayt/solar/solar.core/3.0;
4.将artifactId于version以分隔符连字号连接到后面:com/erayt/solar/solar.core/3.0/solar.core-3.0;
5.判断如果构件有classifier,就要在第4项后增加分隔符连字号(-)再加上 classifier,如果没有就不用加,如solar.core就不用;
6.检查构件的extension,如果extension存在,则加上句点分隔符和extension,而extension是由packaging决定的,com/erayt/solar/solar.core/3.0/solar.core-3.0.jar。

至此,我们了解了Maven对于构件存储的细节。Maven仓库分为两大类,分别是本地仓库和进程仓库。当Maven根据坐标寻找构件时,首先会查看本地仓库,如果有,就直接使用;如果没有,就会去进程仓库查找,找到后会先下载到本地仓库,再使用;如果进程仓库也查找不到,则报错。

本地仓库,存在于安装Maven机器的本地,在第一次执行maven命令时被创建,路很默认是在用户自己的用户目录下的 .m2/repository/ 下,也可以通过编辑Maven的配置文件settings.xml中的localRepository标签,来将本地仓库设置为想要的地址。一个构件只有在本地仓库中之后,才能由其它的Maven项目使用。一般通过
mvn install命令,来将构件安装到本地仓库中去。

进程仓库,顾名思义,就是存在于服务器上的仓库。当我们刚安装好Maven时,本地仓库里面还没有任何构件,此时就需要我们自己安装,以及从进程仓库中下载构件来充实自己的本地仓库了。进程仓库有很多个,其中,Maven默认的进程仓库为中央仓库(http://repo.maven.apache.org/maven2),该仓库中包含了世界上绝大多数流行的开源java构件,以及源码、作者信息、SCM、信息、许可证信息等,也是Maven能做到“开箱即用”的最大保证。其余还有一些第三方的仓库,如jcenter、google、阿里于都开设了自己的Maven仓库,有兴趣的读者可以自己去寻找对应的信息。

如果有需要,也可以搭建自己的私服,它是一种特殊的进程仓库,假设在局域网内,供组织内部使用。它有以下好处:
1、节省自己的外网带宽。大量对外部仓库的重复请求会消耗很大的带宽,利用私服代理外部仓库后,可消除对外的重复下载;
2、加速Maven构建。不停地连接请求外部仓库是十分耗时的,但查询局域网内的仓库则很快;
3、可以部署自己专用的构件,或者外面不存在的第三方构件;
4、提高稳定性,增强控制。Maven构建高度依赖于进程仓库,当Internet不稳定时,Maven的构建也会变得不稳定,甚至无法构建。而使用私服后,由于其中已经缓存了大量的构件,即使暂时没有Internet,Maven也可以正常运行;
5、降低中央仓库的负荷。

Nexus为常用的Maven私服搭建软件,公司的仓库目前就是使用的这个,有兴趣的读者可以自行查找相关资料。

三、Maven生命周期

在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理、编译、测试及部署。Maven从大量项目和构建工具中学习和反思,总结了高度完善的、易扩展的生命周期,将构建过程中的每一步,都映射到生命周期的每一个环节中。

Maven拥有三套相互独立的生命周期,分别为clean,default和site,每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段,下面会对每个周期包含的阶段进行阐述,并对其中重要的阶段作出注释。

clean周期为项目的清理周期,包含pre-clean,clean(清理上一次构建生成的文件),post-clean三个阶段。default周期定义了真正构建时所需要执行的所有步骤,它是三个周期中最核心的部分,包含了如下阶段 : validate,initialize,generate-sources,process-sources(处理项目主资源文件),generate-resources,process-resources,compile(编译项目的主源码),process-classes,generate-test-sources,process-test-sources(处理项目测试资源文件),generate-test-resources,process-test-resources,test-compile(编译项目的测试代码),process-test-classes,test(使用单元测试框架运行测试,测试代码不会被打包或部署),prepare-package,
package(接受编译好的代码,打包成可发布的格式,如jar),pre-integration-test,integration-test,post-integration-test,verify,install(将包安装到Maven本地仓库,供本地其他Maven项目使用),deploy(将最终的包复制到进程仓库,供其他开发人员和Maven项目使用)。site周期的功能为基于pom中的信息,自动建立和发布项目站点,包含了pre-site,site(生成项目站点文档),post-site,site-deploy(将生成的项目站点发布到服务器上)。

对于上述未加注释的阶段,根据名字也能大概猜到其用途,若想进一步了解这些阶段的详细信息,可以参考官方文档

当我们使用一个Maven命令,如mvn package时,实际执行的是该阶段所属周期从第一个阶段到调用阶段之间的所有阶段,即default周期从validate到package之间的所有阶段。而调用多个周期的命令,如mvn clean install时,则执行的是各个周期对应的第一个到调用阶段之间的所有阶段,即pre-clean、clean,以及default周期的validate到install之间的所有阶段。

四、Maven插件

Maven生命周期以及其各个阶段,都是抽象出来的概念,其实际的动作都是通过插件来实现的,不同的生命周期绑定不同的插件,如clean周期绑定的maven-clean-plugin,site周期绑定的maven-site-plugin,default周期根据不同的阶段绑定了不同的插件,如compile阶段绑定了maven-compiler-plugin,package阶段绑定了maven-jar-plugin或maven-war-plugin等。Maven核心的东西不过3-4M,一旦在执行任务时没有碰到插件,它就会跑到相应的地方去下载,放到本地仓库中,之后再完成整个过程。

为了能够复用代码,一个插件往往能够完成多个任务。如maven-dependency-plugin,它能够基于项目依赖做很多事情。它能够分析项目依赖,帮助找出潜在的无用依赖;它能够列出项目的依赖树,帮助分析依赖来源;它能够列出项目所有已解析的依赖等等。为每个这样的功能编写一个独立的插件显然是不可取的,因此,这些功能聚集在一个插件里,通过插件的目标来区分这些功能,如上述的dependency插件的功能就是分别通过mvn dependency:analyze、mvn dependency:tree、mvn dependency:list来调用。

了解插件后,就有一个问题,maven默认的生命周期及阶段,都有对应的插件来执行,但是我们想要做的任务,在默认的阶段里面没有怎么办?这时就可以通过自己来选择某个插件的某个目标,在pom的build-plugins中将其绑定到生命周期的某个阶段上,然后调用命令执行相应任务,当生命周期绊过这个阶段时,就会执行绑定的该目标了。比如我们希服混淆项目中的js/css源码,可以通过如下的配置来处理:
在这里插入图片描述

这样当我们执行mvn package时,就会执行该插件的compress goal,达到将js/css混淆的目的。

Maven的插件有很多种,除了上述生命周期中提到的阶段对应的插件外,还有各种各样具有各式功能的官方和非官方插件,通过自定义绑定的方式能让Maven项目在构建过程中执行更多更富特色的任务。其中,官方提供的插件在http://maven.apache.org/plugins/index.html上能找到,里面也有相应的说明信息;需要完成一些特定功能的任务,官方又没有提供,就需要自己去寻找对应功能的插件了,比如上面的js/css混淆插件;如果任务比较特殊或本地化,并没有这样的插件,则需要自己去开发对应的插件,比如公司的Maven入库管理插件就是针对公司的管理需求来开发的。

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

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

相关文章

SpringCloud系列(19)--将服务消费者Consumer注册进Consul

前言:在上一章节中我们把服务提供者Provider注册进了Consul,而本章节则是关于如何将服务消费者Consumer注册进Consul 1、再次创建一个服务提供者模块,命名为consumerconsul-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选…

使用CubeMx配置GD32F303系列单片机进行DMA ADC

原理图查看 查原理图可以看到GD32F103C8T6的官方开发板GD32303C-START-V1.0的PA1没有接任何东西 使用PA1作为ADC端口 CubeMX配置ADC和时钟 配置ADC通道 启用循环模式 配置此通道ADC分频 配置ADC DMA为循环模式 配置时钟 生成项目 Keil里面的配置 选择对应的GD32型号 编译…

2024全新瀚海跑道:矢量图片迅速养号游戏玩法,每天一小时,日转现200

最初我注意到这种玩法,是因为最近在浏览各大平台的视频时,我发现了一种特殊类型的账号,其养号成功率高达90%。这些账号发布的视频内容和数据非常夸张,而且制作起来非常简单,任何人都可以轻松上手。这些账号主要发布矢量…

堆与优先队列——练习题

1. 数据流中的第 K 大元素 代码实现: 思路:创建一个大小为 k 的小顶堆,堆顶元素就是第 K 大元素 typedef struct {int *__data, *data;int size;int n; } KthLargest;#define swap(a, b) { \__typeof(a) __c (a); \(a) (b); \(b) __c; \ }…

C++ 笔试练习笔记【1】:字符串中找出连续最长的数字串 OR59

文章目录 OR59 字符串中找出连续最长的数字串题目思路分析实现代码 注:本次练习题目出自牛客网 OR59 字符串中找出连续最长的数字串 题目思路分析 首先想到的是用双指针模拟,进行检索比较输出 以示例1为例: 1.首先i遍历str直到遍历到数字&a…

字符串类型漏洞之updatexml函数盲注

UPDATEXML 是 MySQL 数据库中的一个函数,它用于对 XML 文档数据进行修改和查询。然而,当它被不当地使用或与恶意输入结合时,它可能成为 SQL 注入攻击的一部分,从而暴露敏感信息或导致其他安全漏洞。 在 SQL 注入攻击中&#xff0…

CentOS 9 (stream) 安装 nginx

1.我们直接使用安装命令 dnf install nginx 2.安装完成后启动nginx服务 # 启动 systemctl start nginx # 设置开机自启动 systemctl enable nginx# 重启 systemctl restart nginx# 查看状态 systemctl status nginx# 停止服务 systemctl stop nginx 3.查看版本确认安装成功…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中,线性回归模型是一种基础且广泛使用的算法,简单易于理解,但功能强大,可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念,还可以为进一步探索更…

深信服超融合虚拟机备份报错显示准备备分镜像失败

问题:最近一段时间深信服超融合虚拟机在执行备份策略时总是报错,备份空间又还很富余。 解决办法: 1 删除备份失败虚拟机的所有备份 2 解绑该虚拟机的备份策略 可靠服务>>备份与CDP>> 找到备份策略>>点【编辑】>>…

刷机维修进阶教程---开机定屏 红字感叹号报错 写字库保资料 救砖 刷官方包保资料的步骤方法解析

在维修各种机型 中经常会遇到开机定屏 进不去系统,正常使用无故定屏进不去系统或者更新降级开机红色感叹号的一些故障机。但顾客需要报资料救砖的要求,遇到这种情况。我们首先要确定故障机型的缘由。是摔 还是更新降级 还是无故使用重启定屏等等。根据原因来对症解决。 通过…

springboot3整合redis

redis在我们的日常开发中是必不可少的&#xff0c;本次来介绍使用spring boot整合redis实现一些基本的操作&#xff1b; 1、新建一个spring boot项目&#xff0c;并导入相应的依赖&#xff1b; <dependency><groupId>org.springframework.boot</groupId><…

基于YOLOV8+Pyqt5无人机航拍太阳能电池板检测系统

1.YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术&#xff0c;它基于先前YOLO版本在目标检测任务上的成功&#xff0c;进一步提升了性能和灵活性&#xff0c;在精度和速度方面都具有尖端性能。在之前YOLO 版本的基础上&#xff0c;YOLOv8 引入了新的功能和优化&#xff0c;…

PDF 正确指定页码挂载书签后,书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另做一篇原因是一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到的…

C++笔试强训day9

目录 1.添加逗号 2.跳台阶 3.扑克牌顺子 day9的题目都比较简单&#xff0c;就不赘述了 1.添加逗号 链接 我的思路很清晰也很简单易懂&#xff1a; 把输入数据存入字符串string s&#xff0c;定义一个string ret&#xff0c;然后逆置string s&#xff0c;将s中的数一个一个…

C#窗体控件ColorDialog

介绍 可以获取颜色&#xff0c;然后对其他控件的颜色属性进行设置。 构造方式 直接把ColorDialog控件拖动到Form窗口。 常用属性 AllowFullOpen 可以控制是否使用自定义颜色&#xff0c;true表示可使用&#xff0c;否&#xff0c;表示不可使用。 AnyColor 如果为tr…

C#给PDF加文字水印

安装iTextSharp包。 using iTextSharp.text.pdf; using iTextSharp.text; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Pdf1 {internal class Program{public static v…

Python爬虫-BeautifulSoup解析

1.简介 BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它提供了一种灵活且方便的方式来导航、搜索和修改树结构或标记文档。这个库非常适合网页抓取和数据提取任务&#xff0c;因为它允许你以非常直观的方式查询和操作文档内容。 2.安装 Beautiful Soup 终端输…

MyBatis面试题总结,详细(2024最新)

面试必须要看看 1、MyBatis 中的一级缓存和二级缓存是什么&#xff1f;它们的区别是什么&#xff1f; MyBatis 中的一级缓存是指 SqlSession 对象内部的缓存&#xff0c;它是默认开启的。一级缓存的生命周期是与 SqlSession 对象绑定的&#xff0c;当 SqlSession 关闭时&#…

PotatoPie 4.0 实验教程(25) —— FPGA实现摄像头图像直方图均衡变换

图像的直方图均衡是什么&#xff1f; 图像的直方图均衡是一种用于增强图像对比度的图像处理技术。在直方图均衡中&#xff0c;图像的像素值被重新分配&#xff0c;以使得图像的直方图变得更均匀&#xff0c;即各个像素值的分布更加平衡。这意味着直方图中每个像素值的频率大致…

图像处理到神经网络:线性代数的跨领域应用探索

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…