深入理解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>
相关推荐
你的人类朋友几秒前
🍃认识一下boomi
后端
苏三说技术5 分钟前
MySQL的三大日志
后端
豌豆花下猫14 分钟前
让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
后端·python·ai
找不到、了35 分钟前
Spring的Bean原型模式下的使用
java·spring·原型模式
超级小忍44 分钟前
Spring AI ETL Pipeline使用指南
人工智能·spring
南雨北斗1 小时前
TP6使用PHPMailer发送邮件
后端
你的人类朋友1 小时前
🤔什么时候用BFF架构?
前端·javascript·后端
争不过朝夕,又念着往昔2 小时前
Go语言反射机制详解
开发语言·后端·golang
绝无仅有4 小时前
企微审批对接错误与解决方案
后端·算法·架构
hweiyu004 小时前
Maven 私库
java·maven