Maven采坑:依赖版本问题

问题:

明明二方件中指定了redisson版本未3.24.0,但微服务引入二方件时,redisson版本永远是3.16.8

分析:

项目POM结构如下:
父项目 A1

<dependency>
   <groupId>A2</groupId>
   <artifactId>A2</artifactId>
   <version>0.0</version>
   <type>pom</type>
   <scope>import</scope>
</dependency>

父项目依赖项目 A2

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.8</version>
</dependency>

微服务 B

<parent>
    <artifactId>A1</artifactId>
    <groupId>A1</groupId>
    <version>8.1</version>
</parent>
<dependency>
    <groupId>C</groupId>
    <artifactId>C</artifactId>
</dependency>

二方件 C1

<parent>
    <artifactId>C2</artifactId>
    <groupId>C2</groupId>
    <version>1.1</version>
</parent>
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
</dependency>

二方件父项目 C2

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.24.0</version>
</dependency>

Maven相关知识:

知识一:
说明:当一个父pom中的dependencyManagement 标签中需要导入另一个pom中的dependencyManagement的时候,必须同时使用import 和 pom
例子:

 <dependencyManagement>
     <dependencies>
         <dependency>
             <!-- Import dependency management from Spring Boot -->
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>2.0.1.BUILD-SNAPSHOT</version>
             <type>pom</type>
             <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
这个时候,该pom中dependencyManagement就会包含导入的spring-boot-dependencies中的所有dependencyManagement
这是为了解决pom类型的父工程单继承的问题,通过导入,可以导入各种其他父工程的dependencyManagement

注意:dependencyManagement只在父工程(即pom类型的maven工程)中声明,在子工程中定义无需声明版本从而生效。如果在jar类型的maven工程中添加了dependencyManagement,是没有意义的。

参考链接:https://www.cnblogs.com/cainiao-Shun666/p/15822262.html

知识二:
1、名词解释
依赖版本:指dependencies中直接依赖
管理版本:指dependencyManagement中管理的版本
本级:指当前工程
上级:指parent依赖的jar
下级:指本级引用的jar
背景与目的
在使用maven管理jar包时,经常出现jar包冲突,导致程序没有按预想的执行报错问题。
因此需要对jar加载顺序有所了解,并进行合理管理。
2、加载原则
当依赖一个jar包多个版本时,优先使用哪个版本,原则如下:
本级优先于上级,上级优先于下级;
本级依赖版本优先于管理版本;
同一个包中后加载的版本覆盖先加载的版本;
上级管理版本和本级管理版本会覆盖下级依赖版本;
不同下级jar中依赖了不同版本,优先使用先加载下级jar中的版本;
与版本号大小没有关系
本级无法使用下级管理版本
参考链接:https://blog.csdn.net/lizz861109/article/details/111594969

结论:

由于本级优先于上级,上级优先于下级的加载原则,B中的redisson版本实际上是由A2指定的,因为使用import后A1和A2等于都是上级pom。

解决方法:

目前想到的是直接在B中指定redisson版本。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值