当前位置: 首页 > news >正文

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 要更好。

相关文章:

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

文章目录 关于依赖管理坐标和 mvnrepository 网站pom.xml 中"引"包 依赖范围依赖传递依赖冲突 关于依赖管理 坐标和 mvnrepository 网站 在 maven 中通过『坐标』概念来确定一个唯一确定的 jar 包。坐标的组成部分有&#xff1a; 元素说明<groupId>定义当前…...

Python jupyter lab 设置

在下载好jupyter lab 后&#xff0c;需要对其进行设置&#xff0c;尤其是远程服务器的时候&#xff0c;因为根本就是没有屏幕&#xff0c;也没有浏览器。 新建设置文件 jupyter lab --generate-config设置文件内部参数 vim ~/.jupyter/jupyter_lab_config.py进去一通改&#…...

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑&#xff0c;其安全性质与房屋等建筑物完全不同&#xff0c;并且建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;目前对于大坝监测多采用人工巡查的方法&#xff0c;存在一定的系统误差&#xff0c;其工作性态和安全状况随时都在变…...

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会)

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会) Glove子词嵌入上游、下游任务监督学习、无监督学习BERTGlove 子词嵌入 上游、下游任务 监督学习、无监督学习 BERT...

Debian10:安装PHPVirtualBox

PHPVirtualBox 是一个用 PHP 编写&#xff0c;用于管理 VirtualBox 的 Web 前端&#xff08;由AJAX实现&#xff09;。 参考文章&#xff1a;VirtualBoxPHPVirtualBox部署_骡子先生的博客-CSDN博客php virualbox,浏览器远程控制VBox 虚拟机phpVirtualBox_weixin_39815879的博客…...

RANSAC算法

RANSAC简介 RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。 “外点”一般指的的数据中的噪声&#xff0c;比如说匹配中的误匹配和估计曲线中的离群点。所以&#xff0c;RANSAC也是一种“外点”检…...

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…...

Redis_缓存3_缓存异常(数据不一致、雪崩、击穿、穿透)

14.6缓存异常 四个方面 缓存中数据和数据库不一致缓存雪崩缓存击穿缓存穿透 14.6.1数据不一致&#xff1a; 一致性包括两种情况 缓存中有数据&#xff0c;需要和数据库值相同缓存中没有数据&#xff0c;数据库中的数据是最新值 如果不符合以上两种情况&#xff0c;则出现…...

谁能讲清楚Spark之与MapReduce的对比

我们已经知道Spark是如何设计和实现数据处理流程的,这里我们 再深入思考一下,为什么Spark能够替代MapReduce成为主流的大数据处理框架呢?对比MapReduce,Spark究竟有哪些优势? 一 优势 1 通用性: 基于函数式编程思想,MapReduce将数据类型抽象为,k,v格式,并将数据处理…...

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…...

c++11 标准模板(STL)(std::basic_stringbuf)(三)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…...

Nodejs 第九章(模块化)

Nodejs 模块化规范遵循两套一 套CommonJS规范另一套esm规范 CommonJS 规范 引入模块&#xff08;require&#xff09;支持四种格式 支持引入内置模块例如 http os fs child_process 等nodejs内置模块支持引入第三方模块express md5 koa 等支持引入自己编写的模块 ./ …/ 等支…...

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式&#xff1f; 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符&#xff1a; 大小写字母…...

LeetCode 热题 100 JavaScript--33. 搜索旋转排序数组

整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …,…...

并发编程 - 线程池中的常见面试题

目录 1. 线程池相比于线程有什么优点 2. 线程池的参数有哪些 3. 线程工厂有什么用 4. 说一下线程的优先级 5. 说一下线程池的执行流程 6. 线程池的拒绝策略有哪些 7. 如何实现自定义拒绝策略 8. 如何判断线程池中的任务是否执行完成 1. 线程池相比于线程有什么优点 有…...

将多个单独的 Excel 文件合并成一个,并添加标题行

要将多个单独的 Excel 文件合并成一个&#xff0c;并添加标题行&#xff0c;可以使用 Python 的 pandas 库。以下是一个示例代码&#xff0c;假设要合并的 Excel 文件都在同一个文件夹中&#xff1a; import os import pandas as pd # 指定文件夹路径 folder_path path/to/fo…...

VPN pptp和l2tp协议破解

代码下载地址&#xff1a; https://download.csdn.net/download/m0_37567738/88215516?spm1001.2014.3001.5501...

4.3、Flink任务怎样读取Kafka中的数据

目录 1、添加pom依赖 2、API使用说明 3、这是一个完整的入门案例 4、Kafka消息应该如何解析 4.1、只获取Kafka消息的value部分 ​4.2、获取完整Kafka消息(key、value、Metadata) 4.3、自定义Kafka消息解析器 5、起始消费位点应该如何设置 ​5.1、earliest() 5.2、lat…...

C语言实例_和校验算法

一、算法介绍 和校验&#xff08;Checksum&#xff09;是一种简单的纠错算法&#xff0c;用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和&#xff0c;然后将校验和附加到数据中&#xff0c;在接收端再次计算校验和并进行比较&#xff0c;以确定…...

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs&#xff08;访问控制列表&#xff09;时&#xff0c;可以根据以下思路进行设计&#xff1a; 所有者文件权限&#xff1a;确定文件的所有者能够对文件执行哪些操作&#xff0c;如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…...

2026在线测评系统十大量表对比:信效度与场景全解析

【30s 核心摘要】2026 年在线测评成人才管理刚需&#xff0c;信效度与场景适配成选型核心。本文聚焦十大量表&#xff0c;从信度、效度、适配场景等维度深度对比&#xff0c;重点解析问卷星、北森、金数据等主流平台的量表能力与落地效果&#xff0c;为企业、高校及机构提供科学…...

Yokogawa AAI835-H50/K4A00模拟输入/输出模块

Yokogawa AAI835-H50/K4A00 模拟输入/输出模块产品特点&#xff1a;通道配置&#xff1a;共8个通道&#xff0c;含4路模拟输入和4路模拟输出。信号类型&#xff1a;所有通道均支持4-20mA标准电流信号。HART通信&#xff1a;支持HART协议&#xff0c;可与智能现场设备双向数字通…...

Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能

Redis沙盒体验&#xff1a;在浏览器中零门槛掌握NoSQL核心技能 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 当你第一次听说Redis时&#xff0c;是否被那些晦涩的技术术语吓退&#xff1…...

AI开始替人办事后,最危险的不是模型不够强,而是它把旧资料当真了

AI开始替人办事后&#xff0c;最危险的不是模型不够强&#xff0c;而是它把旧资料当真了2026年真正值得重视的AI底层能力&#xff0c;是让模型知道该信谁 你有没有发现一个很扎心的变化。 以前我们用AI&#xff0c;最怕它不会。 现在我们用AI&#xff0c;最怕它太会了。 它能写…...

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南

Atomic Layout核心概念解析&#xff1a;Composition组件如何实现布局与间距分离的终极指南 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout Atomic Layout…...

Vue2-Verify:解决前端验证码安全性与用户体验平衡问题的技术方案实现

Vue2-Verify&#xff1a;解决前端验证码安全性与用户体验平衡问题的技术方案实现 【免费下载链接】vue2-verify vue的验证码插件 项目地址: https://gitcode.com/gh_mirrors/vu/vue2-verify 在当今Web应用开发中&#xff0c;验证码作为防止自动化攻击的关键安全组件&…...

基于STM32与LoRa的低功耗物联网气象站DIY全攻略

1. 项目概述&#xff1a;打造一个低功耗的家庭气象站前阵子想给家里的智能家居系统加点“环境感知”能力&#xff0c;琢磨着搞个能实时监测室外温湿度、风速风向的小玩意儿。市面上成品气象站要么数据出不来&#xff0c;要么功耗感人&#xff0c;不适合长期户外部署。于是&…...

XXPermissions:Android权限管理框架的架构设计与最佳实践

XXPermissions&#xff1a;Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中&#xff0c;权限管理一…...

基于Arduino Uno与MQ-2传感器的智能气体检测报警系统DIY全攻略

1. 项目概述与核心思路最近在捣鼓家里的智能安防&#xff0c;琢磨着能不能自己做一个成本可控、反应灵敏的气体检测报警装置。市面上成品烟雾报警器虽然成熟&#xff0c;但要么功能单一&#xff0c;要么价格不菲&#xff0c;而且很难根据自己的需求进行定制化调整&#xff0c;比…...

大模型测试新范式:Claude端到端验证的5层断言体系(语义一致性/上下文连贯性/安全边界/成本阈值/时序鲁棒性)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;大模型测试新范式&#xff1a;Claude端到端验证的5层断言体系&#xff08;语义一致性/上下文连贯性/安全边界/成本阈值/时序鲁棒性&#xff09; 传统LLM测试常聚焦于准确率或BLEU等静态指标&#xff0c;而Cla…...