面试官:如何解决maven依赖冲突 ,看完本篇教你如何回答

本文详细介绍了maven依赖冲突的原因、解决原则,并通过实例演示如何排除和解决依赖冲突,包括使用Maven Helper插件进行分析。最后,强调了解决依赖冲突时需考虑兼容性和项目影响的重要性。
摘要由CSDN通过智能技术生成

前言

之前有个同学私信我,他去面试时被面试官问到该如何解决maven依赖冲突,不知该怎么回答。本篇就从什么是依赖冲突说起再到如何解决去maven依赖冲突,详细为大家解答。

什么是依赖冲突

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突。

依赖冲突的原因

我们在maven项目的pom中 一般会引用许许多多的dependency。例如,项目A有这样的依赖关系:

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

X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析使用呢? 两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。

至于怎么选肯定有它的规则(下面会讲),这里我们先假设最终引用的X(1.0)版本,这样会不会有问题呢?

当然会有的

1、你想如果B引用X(2.0)的新创建的类,但因为最终被解析的是X(1.0),所以就会出现很典型的NoClassDefFoundError 或ClassNotFoundException依赖冲突报错。

2、如果B引用X(2.0)的新创建的方法,但因为最终被解析的是X(1.0),所以就会抛出 NoSuchMethodError系统异常。

但换种角度,如果最终解析的是X(2.0),就没问题了吗?

那也不一定

1、如果X(2.0)删掉了X(1.0)的一些类,但A已经引用了,同样也会报NoClassDefFoundError或者ClassNotFoundException错误。

2、如果X(2.0)删掉了X(1.0)的一些方法,但A已经引用了,同样也会报NoSuchMethodError错误。

所以说具体问题还需具体分析,到底采用哪个版本还需要看实际项目。也可能我们需要升级对应的A或者B的版本才能解决问题。

如果有两个版本的X,Maven是依据什么原则来选择解析哪个X呢?


 

二、maven依赖原则

maven依赖主要有两大原则

1、路径最近者优先

相同jar不同版本,根据依赖的路径长短来决定引入哪个依赖。

举例

依赖链路一:A -> B -> C -> X(1.0)
依赖链路二:F -> D -> X(2.0)

该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。依赖调解第一原则不能解决所有问题,比如这样的依赖关系:

A -> B -> Y(1.0)
c -> D -> Y(2.0)

Y(1.0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值