【精华】maven 生命周期 + 依赖传递+ scope【依赖范围】 + 排除依赖 可选依赖

news2024/12/25 1:18:21

目录

一 .   lifecycle 生命周期 

二.   依赖 与 依赖传递

三.   scope 依赖范围

scope指定依赖范围

依赖传递依赖与原依赖冲突

四   maven的可选依赖与排除依赖

可选依赖   全部 

排除依赖  显式的指定

maven官网技术文档:


 .   lifecycle 生命周期 

* clean:  清理项目的包
* validate:验证工程是否正确,所有需要的资源是否可用。
* compile: 编译 项目的源代码。
* test:  使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
* package:把已编译的代码 打包成可发布的格式,比如 jar、war 等。
(* integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。)
* verify: 运行所有检查,验证包是否有效且达到质量标准。
* install: 把包 安装 到maven 本地仓库,可以被其他工程作为依赖来使用。
* site:  生成站点文档(报告)等。
* deploy:发布。在集成或者发布环境下执行,将最终版本的包拷到 远程repository,使得其他工程或开发者可共享

二.   依赖 与 依赖传递

1 间接引入的依赖.  又叫 依赖传递依赖【因为 maven的 依赖  具有传递性! ]
       当我们引入了一个依赖的时候,就会自动引入该依赖引入的所有依赖,依次往下引入所有依赖。比如我们引入了Druid数据库连接池的SpringBoot-Starter,就自动引入了该依赖依赖的依赖。总而言之就是套娃就完事了。
 我们将这种依赖称为 间接引入的依赖.
2 直接依赖。
        在pom文件中,直接用<dependency>标签中引入的依赖称为 直接依赖
  • 如果 直接依赖 和 间接引入的依赖 重复了并且版本不一样的话会怎么办呢?
  以显式的 直接依赖为主。
  • 如果 间接引入的依赖冲突了 (比如maven helper里看的 conflict的s),最后引入的到底是哪个版本呢,还是说都会引入呢?
如果是间接引入的(依赖传递的)重复了,遵从以下规则:

 

简单来说,就是越在外层的优先级越高,如果同级的就按照配置顺序,配置顺序靠前的覆盖配置顺序靠后的。

三.   scope 依赖范围

scope指定依赖范围

首先,maven项目 如果不使用插件,依赖都不会被打包。  maven项目的依赖传递全靠pom.xml。
        scope是指依赖范围, 作用于maven的周期。指定 某包的依赖范围。(并限定 那些包  依赖传递 的范围
编译 compile 、 测试 test、 发布后运行 deploy。
  依赖范围   就是用来  控制依赖 和  三种classpath  (编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围: 【这里的  运行/打包deploy  和 在idea中 运行主程序main方法  不是一个概念。
  • compile :   【默认】 编译、测试、运行 依赖范围。
        如果没有指定,就会 默认使用该依赖范围。 使用此依赖范围的Maven依赖,对于 编译、测试、运行三种 classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。
        典型的例子是: log4j。
  • test :     测试依赖范围 。   这个范围是不可传递的。
        表示应用程序的正常使用时不需要依赖项,仅适用于测试编译和执行阶段。使用次依赖范围的Maven依赖,只对于 测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要。
        典型的例子是: juint。
  • provided只是先编译着,运行时由容器提供编译和测试 。   这个范围是不可传递的。
        使用此依赖范围的Maven依赖,对于 编译和测试 的classpath有效,但在运行时候无效。 表示您期望 JDK 或容器在运行时提供依赖项。
        典型的例子是: servlet-api。 编译和测试项目时需要该依赖,但在运行项目时 由容器提供,不需要重复地import。
  • runtime: 有现成的不编译,在 测试运行时有效。
         表示编译时不需要依赖,但执行时需要依赖。Maven 在 运行时和 测试类路径中包含对此范围的依赖项,但在 编译类路径中不包含此范围。
          典型的例子是: jdbc。

依赖传递依赖与原依赖冲突

        
        如果将 依赖项(横的一行) 设置为左列中的范围,则   该依赖项的 传递依赖项(左竖列) 与顶行的范围会导致主项目中的依赖项具有交叉点列出的范围。如果没有列出范围,则意味着省略了依赖项。
  1.    客(依赖项的传递依赖项)随主(当前依赖项)便   。当前项目指定下,传递依赖项只能取 两者指定范围的 交集(最小项)。
  2.  有冲突时(椭圆区)保持  原则不变。  当 当前依赖项 为runtime时,但  传递依赖项  为provided, 它 不是同样不需要依赖项,反而需要编译 只是运行时由容器提供。所以仍是provided(   依赖项自己不编译;但依赖传递项  编译时需要编译,但运行时由容器提供 == 假设传递依赖项不编译, 只保留依赖传递项的 依赖关系,让容器提供==provided )。
if  简化maven生命周期流程:
     编译(主程序) -> 测试(测试程序) -> (部署)运行, 
取值
适用范围
作用
compile
编译期、测试期、 运行期
       默认 全部生命周期
test
测试期 
       表示正常使用时不需要。用于测试代码的编译和执行,如:junit
provided
编译期、测试期
       表示先编译着,运行时由jdk等容器提供。对于 编译和测试 的classpath有效
runtime
测试期、 运行期
       表示有现成的,不需要编译。测试和运行时需要。
网上说法众说纷纭,需要理解其本质,如下:
注意图中的 这个说法不太对的样子,官网上说明了 runtime包括测试类路径。如下:


四   maven的可选依赖与排除依赖

可选依赖   <optional>全部 

可选依赖指对外隐藏当前所依赖的资源
<dependency>
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <optional>true</optional>
</dependency>
配置了该选项之后,junit这个包里的  间接依赖/传递依赖 就失效了。

排除依赖  <exclusion>显式的指定

显式地指定 排除某些依赖项(多用于版本冲突的时候)。
<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <exclusions> 
         <exclusion> 
             <groupId>org.hamcrest</groupId> 
             <artifactId>hamcrest-core</artifactId>
         </exclusion> 
    </exclusions>
</dependency>
配置了该选项之后,指定的间接依赖/传递依赖  hamcrest-core也会失效。
 

maven官网技术文档:

Maven – Introduction to the Dependency Mechanism
Maven——依赖机制介绍

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

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

相关文章

java密码强度校验

一、代码 Testpublic void test(){//包含数字、大小写字母&#xff0c;长度10-20位 String regular "^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{10,20}$";String example1 "1234567891";System.out.println(example1.matches(regular)); //falseString exa…

Python numpy求均值、保留几位小数

import numpy as nplist_test [0.21, 0.32]print(f{np.mean(list_test):.2f}) #保留两位小数 print(f{np.mean(list_test):.3f}) #保留三位小数

从输入URL到页面呈现

1、url解析 1、1地址解析 http和tcp的关系 tcp&#xff1a;传输通道http&#xff1a;传输协议https&#xff1a;比http多了ssl或者tsl&#xff08;证书验证&#xff09;ftp&#xff1a;大文件传输 客户端与服务器直接传送数据&#xff0c;http相当于快递小哥&#xff0c;tcp…

openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句

文章目录 openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句12.1 语法格式12.2 参数说明12.3 示例 openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行&#xff0c;所有行或者指定的部分行。还可…

【自动化测试验证码处理】如何跳过验证码,直接自动登录呢?

在日常的测试过程中避免不了要遇到登录的测试&#xff0c;但是在登录时又常常遇到验证码&#xff0c;那么该如何跳过验证码&#xff0c;直接自动登录呢&#xff1f; 当前在市面上比较流行的方式有&#xff1a; &#xff08;1&#xff09;直接跳过验证码&#xff08;测试环境中…

快7月底了,让我康康有多少准备跳槽的

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情影响导致好多人都没拿到offer!现在已经快7月底了&#xff0c;具体金九银十只剩下2个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

Principle Component Analysis

简述PCA的计算过程 输入:数据集X={x1,x2,...,xn},需降到k维 ① 去中心化(去均值,即每个特征减去各自的均值) ② 计算协方差矩阵1/nX*X^T(1/n不影响特征向量) ③ 用特征值分解方法/SVD奇异值分解求解②协方差矩阵的特征值与特征向量 ④ 对特征值从大到小排序,选…

websocket发布到iis之后无法创建连接访问

在做websocket测试时在本地的服务可以正常访问&#xff0c;在调试成功之后发布到了iis中&#xff0c;发现无法连接&#xff0c;这时可能有以下几个原因。 WebSocket无法连接到IIS&#xff1a; IIS版本不支持WebSocket&#xff1a;IIS 8.0及更高版本才支持WebSocket&#xff0…

广西学子复读15年,不服从分配。网友:完全是浪费时间

广西学子复读15年&#xff0c;不服从分配。网友&#xff1a;完全是浪费时间 唐尚珺的复读行为引起了网友们的不同解读。有人认为他是一个执念深重的人&#xff0c;目标是考上清华北大&#xff0c;但这个说法是否真实&#xff0c;我们无法确定。无论如何&#xff0c;我们必须认识…

ThinkBook 14 G2-ARE(20VF)原厂Win10系统镜像

lenovo联想笔记本电脑ThinkBook 14 G2-ARE原装出厂系统(20VF)Windows10预装OEM系统 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff1a;10.26GB 注&#x…

知识图谱推理的学习逻辑规则(上)

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型知识图谱推理逻辑规则概率形式化参数化优化 实验实验设置实验结果 结论 原文&#xff1a; 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则。 逻辑规则用于预测时提供了可解释性并且可以推广到其他任务中&#xff0c;因…

抖音矩阵系统源码:开发搭建与技术详解

一、 抖音矩阵系统源码开发概述 抖音短视频seo矩阵系统源码是一款在高速数据处理和分析方面表现卓越的系统。它结合了各种先进的技术&#xff0c;包括深度学习、大数据分析和可视化等&#xff0c;使得抖音在信息处理时更加高效和准确。 该系统源码的开发搭建需要多方面的技术支…

Revit中如何创建一个台阶梯?

拉伸作为族环境中最常用的工具之一&#xff0c;操作简单&#xff0c;用处十分巨大下面用一个台阶的创建步骤&#xff0c;带你们更加了解拉伸的使用。 新建一个族样板&#xff0c;选择公制常规模型&#xff0c;接下来我们要绘制一个类似于这样的简单台阶 首先绘制台阶侧旁的构件…

【JavaScript 03】语句 变量 变量提升 标识符 注释 区块 作用域 条件语句 循环语句 break continue 标签

CSS 语句变量变量提升标识符注释区块条件语句ifif...elseswitch三元运算符 ?: 循环语句whilefordo...whilebreak语句 and continue语句标签 语句 JS程序的执行单位是行&#xff08;line&#xff09; **语句&#xff08;statement&#xff09;**是为了完成特定任务而进行的操…

移动App安全检测的重要性,好用的App安全测试工具分享

一、移动App安全检测的重要性 在移动互联网时代&#xff0c;移动App成为人们生活不可或缺的一部分&#xff0c;人们使用App处理各种个人和敏感信息&#xff0c;因此保护用户的隐私和数据安全至关重要。而移动App安全检测是保障用户隐私和数据安全的重要环节。通过安全检测&…

WebRTC不同方案对比

1.功能上会有一些出入&#xff0c;尤其是国内的metaRTC版本迭代很快&#xff0c; 2.后续的ffmpeg也在进行支持webrtc特性&#xff0c;obs新的版本好像已经支持了webrtc&#xff0c; 3.对于webrtc部分缺少的信令部分的标准化也有了对应的标准whip和whep协议 所以&#xff0c;如…

网络爬虫-网易易盾滑块验证码

首先打开易盾官网&#xff0c;依次单击“在线体验”和“滑块拼图”选项&#xff0c;出现如下图所示的滑块验证码&#xff0c;滑动后发现Network面板成功抓包。 如图所示 其中主要的加密参数可以看出来就是acToken以及cb 我们接着下断点往下走 我通过上图可以看到 acToken&#…

stable-diffusion-webui 环境搭建(台式机GTX1060环境)

1、安装git用于克隆stable-diffusion-webui仓库 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 2、安装python 3.10.7 CNPM Binaries Mirror 3、安装CUDA驱动 win x ->设备管理器 ->显示适配器 查看显卡版本 下载对应驱动Official Advance…

QT学习—【属于自己的】串口调试助手

文章目录 一、功能简介二、串口助手实现2.1 创建UI2.2 扫描可用串口2.3 配置波特率2.4 配置数据位2.5 配置停止位2.6 配置校验位2.7 打开/关闭串口2.8 刷新串口2.9 发送新行2.10 串口发送2.11 串口接收显示2.12 清空接收窗口2.13 定时发送2.14 固定窗口大小 三、总结3.1 将信号…

手把手教你搭建SpringCloud项目(八)集成Ribbon负载均衡器

一、Ribbon的简介 Ribbon是Neflix发布的开源项目&#xff0c;后由Spring Cloud开发团队封装于Spring Cloud中&#xff0c;可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。功能是提供客户端的软件负载均衡算法和服务调用。Ribbon是一个基于HTTP…