Maven 直接依赖、间接依赖、依赖冲突、依赖仲裁

IntelliJ报错「Cannot resolve symbol」:Maven依赖冲突与索引重建的快速修复 在Java开发中,IntelliJ IDEA的「Cannot resolve symbol」错误是高频问题,通常由Maven依赖冲突、IDE缓存异常或项目配置错误引发。本文结合CSDN社区的实战经验与开源项目案例,系统性解析依赖冲突定位、版本仲裁规则及索引重建方案,并提供完整代码示例与操作流程。 阅读详情

直接依赖和间接依赖


在项目中直接引入的依赖叫做直接依赖,而那些被动引入的就叫间接依赖

直接依赖和间接依赖

比如上图中,A 是我们的项目,我们在项目中直接引入了 B 模块,所以 B 和 A 的关系就是直接依赖,而 B 工程内部引入了 C,
所以 B 和 C 也是直接依赖关系,如果 B 工程在引入 C 时,指定了 C 模块的依赖范围是 <scope>compile</scope>,那么 C 模
块就会随着 B 模块一同被引入到我们的工程A 中,这时候 A 和 C 的关系就是间接依赖


依赖冲突

Maven 的依赖冲突,我认为有两种情况,Maven 能自动解决的、需要手动解决的

1. Maven 可以自动解决的依赖冲突

在项目中,不管是直接依赖还是间接依赖,当有多个 <groupId>、<artifactId>相同,<version> 不同的依赖引入时,
Maven 就会认为我们引入了相同模块的不同版本,其就会被判定为依赖冲突,这种情况 Maven 会用自己的仲裁机制帮
我们取舍


2. 需要手动解决的依赖冲突

模块间的 <groupId>、<artifactId>、<version> 都不相同,但是引入的这些模块中具有相同路径的类(包名+类名
完全相同),这个时候就需要我们自己去解决依赖冲突问题


Maven 的依赖仲裁

依赖仲裁是 Maven 自动解决依赖冲突的手段,我们想更好的利用它,就必须知道其仲裁的规则,其通过 最短路径优先
和 先声明优先 两个依据来判断最终留下的模块


最短路径优先

当项目的依赖树中存在相同模块的不同版本时,Maven 的仲裁机制就会介入,其首先会通过最短路径的方式来对
冲突的模块进行取舍,如下图,假设我们的项目是A,明显C模块发生了依赖冲突,那么按照最短路径优先的原则,
Maven 最后会留下 A → B → C 1.0 这个路径下的 C 模块

最短路径优先

先声明优先

当两个依赖冲突的模块,其路径距离相同时,就会使用先声明优先的规则,这个就很简单了,就是留下先声明的模块,
如下图,假设我们的项目是A,两个冲突的模块C到 A 的距离是相同的,这时 Maven 就会根据先声明优先的规则选择
A → B → C 1.0 这个路径下的 C 模块,因为其声明在前

先声明优先

至于什么叫先声明,非常简单,用上图例子,我写个伪代码

<!-- 这个 B 的依赖信息就是先声明的,所以仲裁后会留下B模块中依赖的C模块 -->
<dependency>
    <groupId>B</groupId>
    <artifactId>B</artifactId>
    <version>release</version>
</dependency>
<dependency>
    <groupId>D</groupId>
    <artifactId
浅谈Maven依赖冲突与依赖管理 以上方法虽然治标,但是不治本。如果想依赖冲突不发生,我们需要提前建立一定的规范,团队一起遵守,才能有效避免该类问题。应用项目中使用统一管理基础依赖,定义统一的版本,如常用中间包,工具包,日志包。二方包中不要引入无关的依赖,做到尽量少的依赖。团队开发中,比较常见情况是二方包继承公共的父 pom,从而导致继承许多无相关的依赖,这种情况可以单独管理。二方包做好向下兼容,不要随意改动现有类名,方法名,字段名。项目应用上线之前,将snapshot替换成正式版本。虽然snapshot。 阅读详情

相关推荐

Maven依赖冲突解析:从版本仲裁到实战解决方案

在Java项目构建中,依赖管理是确保项目稳定性和可重现性的基础。Maven作为主流的构建工具,其依赖解析机制基于坐标、传递性依赖和冲突解决策略。理解Maven的“最近定义优先”原则和版本仲裁逻辑,对于解决依赖冲突至关重要。通过分析依赖树、检查依赖管理配置,可以定位版本冲突的根源。常见的解决方案包括使用排除法、依赖管理统一管控、直接声明依赖以及利用Maven Enforcer插件进行版本锁定。这些方法能有效处理如okhttp3与okio版本不匹配等典型问题,提升构建的可靠性和一致性。

weixin_26850069的博客 235

CAD二次开发(C#版):从零搭建开发环境与核心DLL引用指南

本文详细介绍了使用C#进行CAD二次开发的环境搭建与核心DLL引用指南,涵盖Visual Studio配置、AutoCAD插件项目创建、DLL引用技巧及调试方法。通过实战示例和常见问题排查,帮助开发者快速掌握CAD二次开发的核心技术,提升开发效率。

weixin_28837817的博客 714

STM32F0实现数字化SPWM纯正弦波逆变器

这个没啥好说的,搭电路的事。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。

forlifefor的专栏 1万+

FTViewSE利用VB脚本制作简易日报表

罗克韦尔SE用VB做的简单的报表

z0800656的博客 3018

基于AIS动态数据与AI结合得经纬度标示算法

港口船舶智能标注系统 本系统通过结合摄像头视频流和AIS船舶动态数据,利用AI技术实现船舶实时标注功能。系统架构包括视频流处理、AIS数据解析、船舶检测匹配和坐标映射转换等模块。关键技术步骤: AIS数据获取:通过本地接收机或网络API获取船舶位置、航速等信息 AI目标检测:采用YOLOv8等模型识别视频中的船舶 船舶匹配算法:通过位置投影或运动轨迹匹配视频目标与AIS数据 坐标映射:使用相机标定技术将经纬度转换为图像坐标 实时标注:在视频画面上叠加船名、位置等关键信息 应用场景包括港口监控、智能海事管理和

qianbo042311的博客 1793

S7-200SMART PLC中进行MODBUS RTU通信的3种方法(1)

S7-200SMART PLC中进行MODBUS RTU通信的3种方法(1)

Robot_PLC_HMI_Automation 4227

MALTAB程序利用质心法去寻峰

质心法的优点是简单易实现且计算速度快,适用于数据点较少或峰值较明显的情况。然而,对于复杂的数据或多峰曲线,质心法可能无法准确识别所有峰值,因此在这些情况下可能需要使用更复杂的峰值检测算法。质心法(Centroid Method)是一种寻找峰值的方法,其基本原理是通过计算数据窗口内的质心位置来确定峰值的位置。质心是指在一维数据中,按照数据的幅值对位置进行加权平均的结果,即质心位置为数据幅值加权平均值的位置。变量定义了计算质心的窗口大小。最后,绘制了找到的峰值位置和幅值点,并显示了找到的峰值位置和幅值的结果。

走向CTO的路上... 1341

10种电阻综合对比——《器件手册--电阻》

可变电阻在电子设备中也有很多用途,如在收音机的音量调节电路中,通过旋转可变电阻的旋钮来改变电路中的电阻值,从而改变通过扬声器的电流,实现音量的调节。根据电阻定律,电阻R = ρ(L/S),其中ρ是导体材料的电阻率,L是导体的长度,S是导体的横截面积。比如,同样材料制成的两根电线,粗的电线电阻比细的电线电阻小,长的电线电阻比短的电线电阻大。电流采样电阻的工作原理基于欧姆定律,即电阻两端的电压与通过电阻的电流成正比,公式为 I = V/R,其中 I是电流,V是电阻两端的电压,R 是电阻值。

XU157303764的博客 3129

基于Simulink的发动机管理系统中的自适应增压控制系统设计

通过上述详细设计步骤,我们成功开发了一个基于Simulink的自适应增压控制系统。该系统不仅能够实时监测和预测发动机的运行状态,动态调整增压压力目标值,还具备实时监控、故障诊断和保护功能,确保系统的安全性和可靠性。此外,通过仿真实验和硬件在环测试,我们验证了系统的性能,并对其进行了优化,使其能够更好地满足实际应用需求。这个项目展示了如何利用MATLAB/Simulink的强大功能,结合控制理论和工程实践,开发出高效、可靠的自适应增压控制系统。

MHD0815的博客 211

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: Maven 生命周期、自定义插件、生命周期默认绑定的插件
下一篇: Maven 设置环境变量(Windows、Linux)
「已注销」
博客等级 码龄9年 462粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值