深入理解Maven依赖管理:MySQL驱动版本冲突案例分析

背景介绍

  1. 我有一个 common 工程,引入了一个版本较高的 MySQL 驱动依赖
xml 复制代码
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
</dependency>
  1. IDEA 中把 common 工程使用maven插件deploy到远程私有maven仓库
  2. 另一个maven工程A中引入了该common包
xml 复制代码
<dependency>
    <groupId>com.demo</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
  1. 由于工程A需要使用版本较低的MySQL驱动,所以又引入了一个低版本MySQL驱动依赖(在common包依赖的下方,划重点!!!
xml 复制代码
<dependency>
    <groupId>com.demo</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

问题呈现

  1. 运行工程,调用包含数据库操作的接口,我期望使用低版本依赖,实际使用的是高版本依赖。控制台打印由于MySQL驱动和数据库版本不匹配导致的异常信息
swift 复制代码
java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-j-8.0.31.jar:8.0.31]

可以看到,异常信息来自高版本的MySQL驱动包[mysql-connector-j-8.0.31.jar:8.0.31]

问题分析

  1. 目前工程A中引入了两个MySQL驱动依赖,一个是直接引入的,另一个是通过common包间接引入的,scope标签都未指定,默认为compile
  2. 在工程A的pom.xml文件中引入依赖的顺序是,先引入common包,后引入低版本MySQL驱动包,如背景介绍中第四点所示

maven 解析依赖规则

  1. 路径最短者优先:路径距离是从项目开始到依赖项的距离,直接依赖的距离为0,间接依赖的距离为1,以此类推。路径最短的依赖项会被优先使用
  2. 首次声明者优先:在POM文件中首次声明的依赖项会被优先使用

那么这两个规则哪个优先级更高呢?根据我的实践结果来看,显然第二条优先级更高。

解决办法

  1. 方式一 :在工程A的pom.xml文件中排除高版本的依赖
xml 复制代码
<dependency>
    <groupId>com.demo</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <artifactId>mysql-connector-j</artifactId>
            <groupId>com.mysql</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>
  1. 方式二:调换common包和MySQL驱动包的引入顺序
xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
相关推荐
雨中飘荡的记忆3 分钟前
Multi-Agent + Skills + Spring AI 构建自主决策智能体
后端·spring
我叫黑大帅41 分钟前
Go 语言并发编程的 “工具箱”
后端·面试·go
用户8356290780511 小时前
Python 实现 PowerPoint 形状动画设置
后端·python
用户908324602732 小时前
Spring Boot 缓存架构:一行配置切换 Caffeine 与 Redis,透明支持多租户隔离
后端
用户23063627125392 小时前
SpringAIAlibaba学习使用 ---核心API、RAG、Tool Calling
spring
tyung2 小时前
zhenyi-base 开源 | Go 高性能基础库:TCP 77万 QPS,无锁队列 16ns/op
后端·go
子兮曰2 小时前
Humanizer-zh 实战:把 AI 初稿改成“能发布”的技术文章
前端·javascript·后端
桦说编程2 小时前
你的函数什么颜色?—— 深入理解异步编程的本质问题(上)
后端·性能优化·编程语言
百度地图汽车版3 小时前
【AI地图 Tech说】第九期:让智能体拥有记忆——打造千人千面的小度想想
前端·后端
臣妾没空3 小时前
Elpis 全栈框架:从构建到发布的完整实践总结
前端·后端