maven导入jar包时出现依赖冲突的解决办法

一、依赖冲突

a. 什么是依赖冲突

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

b. 依赖冲突的原因

依赖冲突经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖几个隐式的类包,这些隐式依赖的类包会被maven间接引入,从而引起类包版本冲突。

c. 如何解决依赖冲突

首先找到产生依赖冲突的jar包,再找出不想要的依赖jar包,将其手动排除在外即可。

二、解决依赖冲突

a. 查看依赖冲突

1. maven -Dverbose dependency:tree

通过 maven -Dverbose dependency:tree 命令查看项目的依赖版本冲突,-(omitted for duplicate) 表示jar包重复依赖,(omitted for conflict with xxx)表示和别的jar包版本冲突,而该行的jar包不会被引入。
再定位到引起依赖版本冲突的jar包

2. maven helper 插件

如果是idea,可以安装maven helper 插件来检查依赖冲突
安装完之后,打开 pom.xml 文件,点击下面的 Denpendency Analyzer视图如下
image

打开Denpendency Analyzer视图后,会出现

  • Confilicts
  • All Dependencies as List
  • All Denpendencies as Tree
    三个选项

b. 依赖冲突解决方法

项目的pom.xml形如下

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.7.RELEASE</version>
	</dependency>
	
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
		<version>5.2.0.RELEASE</version>
	</dependency>
</dependencies>

通过查看依赖树,我们知道项目会引用5.2.7.RELEASE的spring core jar包,而不会引用5.2.0的jar包,如果我们想用5.2.0版本的spring core包,我们该如何做?

1. 使用第一声明者优先原则

谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar包坐标,就先引用该jar包的传递依赖。因此我们如果要使用5.2.0版本的spring core包,我们可以改成如下声明

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
		<version>5.2.0.RELEASE</version>
	</dependency>
	
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.7.RELEASE</version>
	</dependency>
</dependencies>

查看依赖树(maven -Dverbose dependency:tree)

[INFO]org.example:hello:jar:1.0-SNAPSHOT
[INFO]+-org.springframework:spring-aop:jar:5.2.0.RELEASE:compile
[INFO]| +-org.springframework:spring-beans:jar:5.2.0.RELEASE:compile
[INFO]| | \-(org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for duplicate)
[INFO]| \-org.springframework:spring-core:jar:5.2.0.RELEASE:compile
[INFO]| \-org.springframework:spring-jcl:jar:5.2.0.RELEASE:compile
[INFO]\-org.springframework:spring-context:jar:5.2.7.RELEASE:compile
[INFO]+-(org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) 
[INFO]+-(org.springframework:spring-beans:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) 
[INFO]+-(org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) 
[INFO]\-org.springframework:spring-expression:jar:5.2.7.RELEASE:compile
[INFO]\-(org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)

通过依赖树,我们可以看到项目已经引入5.2.0版本的spring core包

2.使用路径近者优先原则

即直接依赖级别高于传递依赖。因此我们可以在最先的pom.xml添加如下内容

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
</dependencies>

3.排除依赖

排除依赖
如果是idea,可以使用maven helper插件进行排除。点开pom.xml,切换到Dependency Analyzer视图,选择All Dependencies as Tree,点击要排除的jar,右键会出现Execlude选项

<dependencies>
	<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.7.RELEASE</version>
        <exclusions>
            <exclusion>
                <artifactId>spring-core</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
</dependencies>

4.版本锁定

使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

如果我们项目中只想使用spring core 5.2.0的包,pom.xml可以改为如下

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
</dependencies>

总结

综上就是maven如何排查依赖冲突以及解决方法,对于排查依赖使用maven helper插件,至于解决依赖冲突推荐使用版本锁定的方法,此外dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖

引用

maven依赖冲突以及解决方法

posted @   ___xxy  阅读(798)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示