Maven中依赖的优先级问题

一.问题发现

最近在学习Spring的过程中,遇到了这么一个问题:
图1 Maven报错信息
原因图上标记得也很清楚,就是画红线的地方出了问题。
我在pom.xml中申明了一个web的依赖:spring-boot-starter-web。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Maven在进行构建的时候,会将web依赖的其它架包也连同架包web一同导入进来。比如A依赖B,B依赖于C,也就是A -> B -> C。那么我导入A的时候,Maven会自动进行检测A是否依赖了其它架包,如果A依赖了其它架包,就会将A依赖的其它架包也导入进来。对应到这里,虽然我只是申明了需要导入A的架包,但是Maven会把B和C也导入进来。

二.解决问题

回到这里,这个问题该怎么解决?
我在Stack Overflow上找到了一个回答,大意是说:

org.hibernate.validator:hibernate-validator:jar:6.0.11.Final这个包有些问题,建议更新到更高的版本。

于是,我导入了一个更高版本的org.hibernate.validator:hibernate-validator:jar。如下所示,我导入的为6.1.2版本。

<dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.1.2.Final</version>
</dependency>

可以从图中看出,导入以后,以前有报错的那个架包已经变灰色了,显然过去的6.0.11的架包应该是不起作用了,是新的架包在起作用。
图2 导入新的架包

三.问题思考

我的思考

到这里,问题虽然解决了,但是引起了我的一些思考。同样的架包,Maven在执行的时候,究竟执行哪一个,这里面有什么优先级的顺序吗?
A -> B -> C(v1.0)。然后我在pom.xml中导入了A和C(v2.0)的依赖,那A究竟是执行C(v1.0)还是执行C(v2.0)?
由于前几天刚刚在学CSS,对CSS的选择器的印象比较深刻。在CSS里面,不加其它条件的情况下,ID选择器的优先级应该是最高的,比如一个Class选择器和ID选择器都选择到了某个元素,那肯定是执行ID选择器里面的样式。为什么呢?因为ID选择器更加精确!既然是要选择,肯定要将范围缩小到越小越好,这样才能选择。如果选择的范围很广,那不就是全选了嘛,还需要选择器做什么。ID选择器能唯一定位到某个元素,而Class选择器选择的元素却并非唯一的。
然后引申过来,我是这样思考的。在这个项目中web ->hibernate-validator:jar(6.0.11)。但是我显示的定义的只是表明我需要web架包,我再pom.xml中的定义如下:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

hibernate-validator:jar(6.0.11)只是因为执行web架包需要用到,才迫不得已需要导入,而hibernate-validator在这里究竟是需要6.0.11的版本还是需要6.0.22的版本我不关心,Maven应该也不关心,只要能用就行。
而当我在pom.xml中申明了这个依赖的时候,如下所示:

<dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.1.2.Final</version>
</dependency>

这段程序表示了我显示的告诉了Maven:

我需要hibernate-validator:jar这个架包,且我需要的是6.1.2.Final这个架包,其它的我不要,我就要这个。

然后Maven就接受了我的指令去下载6.1.2.Final版本的hibernate-validator的架包,并在我的项目的其它地方需要用到这个架包的时候,统统替换为我指定的这个版本。


当然,上面只是我的思考,有对也有错,下面是网上的一些回答

网上的答案

参考自:

https://www.cnblogs.com/jice/p/12104126.html

pom文件中依赖的的优先级顺序

  1. 依赖最短路径优先原则
    一个项目依赖了两个jar包,其中A -> B -> C ->X(1.0) , A -> D -> X(2.0)。由于X(2.0)路径最短,所以项目使用的是X(2.0)。

  2. pom文件中申明顺序优先:
    如果A -> B -> X(1.0) ,A -> C -> X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,maven会根据pom文件声明的顺序加载,如果先声明了B,后声明了C,那最后的依赖就会是X(1.0)。

  3. 覆写优先
    子pom内声明的优先于父pom中的依赖。

四.总结

本文主要记录了我在学习Sring的过程中遇到的一个小问题,并由此引发的一些关于Maven中依赖的优先级的思考。上面我出现的那个问题的解决方法很多,除了上述将hibernate-validator:jar换成一个更高版本的架包以外,还可以把Spring boot的版本也换成一个更高版本的。原项目使用的是2.0.4.RELEASE的Spring boot,后来我替换为2.2.2.RELEASE,同样也能解决问题。

本文若有不足,欢迎指正

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值