Maven 基础之依赖管理、范围、传递、冲突

祖传图片镇楼

文章目录

    • 关于依赖管理
      • 坐标和 mvnrepository 网站
      • pom.xml 中"引"包
    • 依赖范围
    • 依赖传递
    • 依赖冲突

关于依赖管理

坐标和 mvnrepository 网站

在 maven 中通过『坐标』概念来确定一个唯一确定的 jar 包。坐标的组成部分有:

元素说明
<groupId>定义当前 Maven 组织名称
<artifactId>定义实际项目名称
<version>定义当前项目的当前版本

[✔] 注意
任意两个不同包,它们的这三个属性必定至少有一项是不同的。即,三者的「组合」必须唯一。

那么如何确定一个 java 包的坐标?通过 https://mvnrepository.com 。

mvnrepository 是一个与中央仓库对应的查询系统。在这里你可以查询你所需要的 java 包的坐标。

你只需要复制粘贴你所查到的 java 包的坐标 <repository> 片段即可。

pom.xml 中"引"包

依赖管理」就是对项目中 jar 包的管理。可以在 pom.xml 文件中定义 jar 包的坐标,管理依赖。

整体结构(其它无关元素略)

project 
└── dependencies├── dependency├── dependency├── ...└── dependency

例如:

<dependencies><!--slf4j-api--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!--slf4j-simple--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version></dependency><dependency> ... </dependency>  <dependency> ... </dependency>  <dependency> ... </dependency>  </dependencies>

maven 项目会「引用」你本地仓库中的这些 java 包。理论上,你的本地仓库「应该有」这些包,如果没有,maven 会先从网络仓库中下载它们。如果网络仓库也没有,那么 maven 会报错。

这些 java 库在本地仓库的存放的路径规则是:

%homepath%/.m2/repository/<groupId>/<artifactId>/<version>

例如,上面的 slf4j-api 在本地仓库中的存放路径就是

C:\Users\hello world\.m2\repository\org\slf4j\slf4j-api\1.7.25

[✔] 注意
需要注意的是,maven 项目是在「引用」这些 java 库。在项目最终打包前,你的 maven 项目中并没有真正地「包含」这些 java 包,你会发现无论你「引用」多少 java 包,你的项目源码的文件夹大小实际上并没有增加(其中只有你的项目源码)。maven 就是通过这种方式来节约空间。

依赖范围

依赖范围
(Scope)
对 main classpath 有效对 test classpath 有效打入包中例子
compileYesYesYeslog4j
test-Yes-junit
prividedYesYes-servlet-api
runtime--Yesjdbc 驱动实现类

使用技巧:

  • compile<scope> 的默认值;
  • 错将 runtime 写成 compile ,对项目无影响;
  • 错将 test 写成 compile ,对项目无太大影响。不影响项目运行,仅仅是项目的 jar/war 包会变大;
  • 唯一需要仔细思考、分辨的是 provided 。如果 provided 被误写成了 compile 会导致项目发布运行时因为包冲突而无法运行,或出现 bug 。

[!attention] 注意
你需要留意、甚至记忆哪些包应该是 provided 的。

依赖传递

<dependencies><!--<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency>--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version></dependency><dependencies>

前面的这个依赖可以将 slf4j-api 去掉,也依然可行。原因在于,虽然我们没有声明引用、使用 lslf4j-api ,但是我们声明要引用、使用的 slf4j-simple 它要使用 slf4j-api ,因此,maven 仍然还是会把 slf4j-api 纳入我们的项目中。

[?] 我们如何知道 slf4j-simple 它会使用 slf4j-api ?

有两种方式:

  1. 在 mvnrepository.com 中查询 slf4j-simple 时,该网站上会列出它所依赖的其它的包(如果有的话)

  2. 开发工具会有图形化界面让你能看到包的依赖关系,你可以直观地看到,slf4j-simple 依赖于 slf4j-api 。这样你可以对你的 repositories 进行优化。

依赖冲突

依赖冲突指的是你的项目中「包含了同一个包的两个不同版本」。这种情况下通常会导致项目报错,或启动失败。

依赖冲突常见于两个场景:

  1. 同一个项目的两个开发人员不约而同想到使用同一个 java 库,而互相不知道。从而导致项目的 pom 中引入了同一个包的两个不同版本。

  2. 项目依赖于 A 和 B 两个库,看似没有问题,但是 B 库本身又依赖于 A 库(或者是,B 库依赖于 C 库,而 C 库依赖于 A 库)。从而导致项目中最终还是包含了 A 库的两个不同版本。

Maven 会自动解决依赖冲突问题,它基于 2 个原则来处理:

  1. 路径最近者优先

    项目 A 有如下的依赖关系:

    A -> B -> C -> X (1.0)

    A -> D -> X (2.0)

    maven 最终包含的会是 X 库的 2.0 版本。

  2. 路径相等,先声明者优先

    项目 A 有如下的依赖关系:

    A -> B -> Y(1.0)

    A -> C -> Y(2.0)

    若 pom 文件中 B 的依赖坐标先于 C 进行声明,则最终 Y 的版本为 1.0 。

在开发工具中,可以有图形化界面让你直观地看到依赖关系,其中会将依赖冲突展示出来。IDEA 图形化展示效果比 Eclipse 要更好。

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

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

相关文章

python3 0学习笔记之基本知识

0基础学习笔记之基础知识 &#x1f4da; 基础内容1. 条件语句 if - elif - else2. 错误铺捉try - except(一种保险策略&#xff09;3. 四种开发模式4. 函数&#xff1a;def用来定义函数的5. 最大值最小值函数&#xff0c;max &#xff0c;min6. is 严格的相等&#xff0c;is no…

微服务系列文章之 Springboot+Vue实现登录注册

一、springBoot 创建springBoot项目 分为三个包&#xff0c;分别为controller&#xff0c;service&#xff0c; dao以及resource目录下的xml文件。 UserController.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 …

matlab使用教程(17)—广度优先和深度优先搜索

1.可视化广度优先搜索和深度优先搜索 此示例说明如何定义这样的函数&#xff1a;该函数通过突出显示图的节点和边来显示 bfsearch 和 dfsearch 的可视化结果。 创建并绘制一个有向图。 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G dig…

微服务—Eureka注册中心

eureka相当于是一个公司的管理人事HR,各部门之间如果有合作时&#xff0c;由HR进行人员的分配以及调度&#xff0c;具体选哪个人&#xff0c;全凭HR的心情&#xff0c;如果你这个部门存在没有意义&#xff0c;直接把你这个部门撤销&#xff0c;全体人员裁掉&#xff0c;所以不想…

信安通用基础知识

文章目录 密码学经典误区PGP优良保密协议信安经典其它安全手段XSS与CSRF cross site request forgeryCSRF的利用逻辑CSRF示例CSRF防范检查Referer字段添加校验token XSS cross site scripting common weakness enumeration常见密码api误用&#xff08;摘自毕设参考文献&#xf…

蓝蓝设计-ui设计公司-界面设计案例作品

泛亚高科-光伏电站控制系统界面设计 html前端 | 交互设计 | 视觉设计 | 图标设计 泛亚高科(北京)科技有限公司&#xff08;以下简称“泛亚高科”&#xff09;&#xff0c;一个以实时监控、高精度数值计算为基础的科技公司&#xff0c; 自成立以来&#xff0c;组成了以博士、硕…

vue中的路由缓存和解决方案

路由缓存的原因 解决方法 推荐方案二&#xff0c;使用钩子函数beforeRouteUpdate&#xff0c;每次路由更新前执行

3 Python的数据类型

概述 在上一节&#xff0c;我们介绍了Python的基础语法&#xff0c;包括&#xff1a;编码格式、标识符、关键字、注释、多行、空行、缩进、引号、输入输出、import、运算符、条件控制、循环等内容。Python是一种动态类型的编程语言&#xff0c;这意味着当你创建一个变量时&…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(一)(IOC之实例化)

目录 前言阅读准备阅读指引阅读建议 课程内容一、SpringIOC之实例化1.1 简单回顾1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 AbstractBeanFactory#getMergedLocalBeanDefinition&#xff1a;合并BeanDefinition2.2 AbstractAutowireCapableBeanFactory#createBean&#xff…

QT处理日志文件

由于实际生产需要&#xff0c;软件系统的运行&#xff0c;会产生大量的日志文件&#xff0c;有时候一天就能产生超过百万条log记录&#xff0c;那么为了能够处理日志文件&#xff0c;查询并且找到我们想要的报错信息&#xff0c;因此不得不考虑怎么实现&#xff0c;打开大日志文…

CFD特性FPmarkets澳福认为了解这11种足够了

CFD在交易中很重要&#xff0c;但CFD特性很多投资者不了解&#xff0c;FPmarkets澳福认为了解这11种足够了&#xff1a; 1. 投资者通过标的资产价格价值的变化获利&#xff0c;而不拥有标的资产。 2. 差价合约交易没有固定的到期日。 3. 与期货交易类似&#xff0c;差价合约交易…

python自动化办公的一些小工具,函数组件

上一篇文章写了怎么自动化写一个月报&#xff0c;其中有很多很好用的函数组件&#xff0c;都被我封装为了函数&#xff0c;功能很好用。下面一一介绍&#xff1a; 1.添加汇总函数 输入一个pandas的数据框&#xff0c;就会返回一个加了汇总行的数据框。 def add_summary_row(d…

慎投!新增4本期刊被“On Hold”!快自查

又新增了被标记的期刊&#xff01;截至目前&#xff0c;小编从科睿唯安旗下的“Master Journal List”官网查到&#xff0c;本次新增4本ESCI期刊被标记&#xff0c;目前有8本SCIE期刊&#xff0c;1本SSCI期刊&#xff0c;13本ESCI期刊&#xff0c;共22本期刊被标记为“On Hold”…

c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

超声波传感器(HC-SR04)按时序图手撕驱动

目录 1、简介 2、传感器介绍 2.1 引脚介绍 2.2 时序图介绍 3、 需求与接线 3.1 任务需求 3.2 接线 4、Cubemax配置 4.1 SYS配置 4.2 RCC配置 4.3 时钟树配置 4.4 GPIO初始化 4.5 定时器配置 4.6 生成代码 5、 keil端代码编写 5.1 微妙函数封装 5.2 超声波驱动封装…

生信豆芽菜-差异基因富集分析

网址&#xff1a;http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析&#xff0c;注意这个的关键基因集可以是差异基因&#xff0c;WGCNA的module基因&#xff0c;也可以是表型相关的基因集 1、数据准备 准备一个基因…

SpringBoot系列之基于Jersey实现RESTFul风格文件上传API

前言 JAX-RS&#xff1a;JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API&#xff0c;给开发者提供了一系列的RESTFul注解Jersey&#xff1a;是基于JAX-RX API的实现框架&#xff0c;用于实现RESTful Web 服务的开源框架。 JAX-RX常用的注解&#xff1a; javax.ws.rs.Pa…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度&#xff08;解包&#xff09; 3、8位协议&#xff08;分用&#xff09; 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

IDEA 设置为护眼的豆沙绿

代码区域设置成护眼色 先打开 IDEA 的设置界面&#xff0c;然后按照下图按顺序店了设置就可以了 这个时候&#xff0c;可以看到&#xff0c;只有代码区域别成了护眼色&#xff0c;其他地方还是白的刺眼&#xff0c;我们来一个一个的解决掉 左侧的文件页修改为护眼色 还是先…

基于YOLOv8模型的五类动物目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的五类动物目标检测系统可用于日常生活中检测与定位动物目标&#xff08;狼、鹿、猪、兔和浣熊&#xff09;&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与…