Maven的仓库、周期和插件

一、简介

随着各公司的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入库管理插件就是针对公司的管理需求来开发的。

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

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

相关文章

如何把经验变成可以销售的“知识产品”?

知识付费,很多人想做,但是不知道如何把自己在某方面的“经验”,变成一个“知识产品”,那么这篇文章,我们就来聊聊如何从0打造一个知识产品 非常简单,一共六个步骤: 第一步:取名字&…

【深度学习】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境,我们推荐使用以下简洁明了的中文资源: 项目源码获取: 通过以下命令轻松克隆项目及所有子模…

(一)Dataframes安装与类型 #Julia数据分析 #CDA学习打卡

目录 一. Julia简介 二. Dataframe构造方法 1)访问列的方式 (a)判断严格相等 i. 切片严格相等是true ii. 复制严格相等是false (b)判断相等 i. 切片相等是true ii. 复制相等是true 2)获取列名称 …

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ③

DRQ什么时候调度Node去填写dependency ::Pipeline调度Node的sequenceId 0执行 Pipeline::ProcessRequest() { for (UINT nodeIndex 0; nodeIndex < m_orderedNodeCount ; nodeIndex) m_pDeferredRequestQueue->AddDef…

ROM修改进阶教程------如何去除安卓机型系统的开机向导 几种操作步骤解析

在和很多工作室定制化系统中。手机在第一次启动的时候系统都会进入设置向导,虽然可以设置手机的基本配置。但有很多客户需要去除手机的开机向导来缩短开机时间。确保手机直接进入工作状态。那么今天的教程针去除对开机向导的几种方法做个解析。机型很多版本不同。操作也有不同…

JS实现对用户名、密码进行正则表达式判断,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

四川易点慧电子商务:抖音小店引领潮流,先进模式打造电商新标杆

在当下数字化浪潮中&#xff0c;电子商务行业如日中天&#xff0c;四川易点慧电子商务有限公司以其独特的视角和前瞻性的战略布局&#xff0c;成功在抖音小店领域崭露头角&#xff0c;成为行业内的佼佼者。本文将深入剖析四川易点慧电子商务的成功秘诀&#xff0c;以及其在抖音…

【openLooKeng-1.10.0集群环境安装部署】

openLooKeng-1.10.0集群环境安装部署 一、摘要二、正文1. 环境说明2. 集群拓扑图3. 安装过程(以root用户安装)3.1 在Coordinator和Worker两个节点都需要安装jdk1.8+3.2 在Coordinator上安装配置openLooKeng3.3 在Worker节点上进行配置openLooKeng3.4 在Coordinator节点上先启…

Spring Boot集成Redisson实现延迟队列

项目场景&#xff1a; 在电商、支付等领域&#xff0c;往往会有这样的场景&#xff0c;用户下单后放弃支付了&#xff0c;那这笔订单会在指定的时间段后进行关闭操作&#xff0c;细心的你一定发现了像某宝、某东都有这样的逻辑&#xff0c;而且时间很准确&#xff0c;误差在1s内…

OceanBase单机版安装体验

前情提要 上周OceanBase开发者大会过后&#xff0c;作为观察员也来体验一下OB的安装。业内有某个国产安装用了两周&#xff0c;这种其实有点劝退了。话说就是10年前&#xff0c;没搞过Oracle的人也不用两周安装一个数据库啊。今天看看OB的&#xff08;一体化&#xff09;安装。…

【震撼揭秘】Sentinel:一文读懂,那些让开发者“拍案叫绝”的核心特性!

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在微服务架构中&#xff0c;流量治理是确保系统稳定性和高可用性的关键。Sentinel作为一项强大的流量控制组件&#xff0c;为我们提供了完善的解决方案。本文将带您走进Sentinel的世界…

第11章 Android特色开发——基于位置的服务

第11章 Android特色开发——基于位置的服务 本章中&#xff0c;将要学习一些全新的Android技术&#xff0c;这些技术有别于传统的PC或Web领域的应用技术&#xff0c;是只有在移动设备上才能实现的。 基于位置的服务&#xff08;Location Based Service&#xff09;。由于移动…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

flutter笔记-webrtc使用1:依赖本地包socket.io-client

文章目录 1. 示例工程2. yaml 修改3. 使用4. socketio 关于自定义服务器自定义签名的问题封装成async和await方式 本文开始介绍webrtc的使用&#xff0c;阅读本文的前提是假设你已经使用过webrtc&#xff0c;了解webrtc的交互机制&#xff0c;不了解的可以看之前的文章&#xf…

【Java数据结构】初步认识ArrayList与顺序表

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

【线性代数 C++】求逆矩阵

对于 n n n阶矩阵 A A A&#xff0c;如果有 n n n阶矩阵 B B B&#xff0c;使 A B B A E ABBAE ABBAE&#xff0c;则说 A A A是可逆的&#xff0c;并把 B B B称为 A A A的逆矩阵. A A A的逆矩阵记作 A − 1 A^{-1} A−1&#xff0c;则 B A − 1 BA^{-1} BA−1.若 ∣ A ∣ ≠…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…