maven依赖冲突以及解决方法

简介: maven依赖冲突以及解决方法

查看依赖冲突


# 通过dependency:tree是命令来检查版本冲突
mvn -Dverbose dependency:tree


其中omitted for duplicate表示有jar包被重复依赖,最后写着omitted for conflict with xxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入


如:omitted for conflict with 5.2.7.RELEASE,表示spring-core 5.2.0版本不会被项目引用,而spring-core 5.2.7版本会被项目引用


idea可以安装maven helper插件检查依赖冲突

maven helper插件安装成功,点开pom.xml会发现多了一个Dependency Analyzer视图

5c6f57323e2840a08d38d0273cd31bca.png


上面按钮的图标含义如下


Conflicts(查看冲突)


All Dependencies as List(列表形式查看所有依赖)

All Dependencies as Tree(树形式查看所有依赖)


上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个jar产生冲突,如下图

2fe171a31dc0400aa464d54e2f702feb.png


2. 解决冲突

 <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包,应该如何做


使用第一声明者优先原则

谁先定义的就用谁的传递依赖,即在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>


  • 使用路径近者优先原则
    即直接依赖级别高于传递依赖。因此我们可以在最先的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>


排除依赖


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

425367997bf84f11af7a05d77915a8a5.png

它产生的效果和如下配置是一样

 <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>
  • 版本锁定
    使用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>


dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖

相关文章
|
Dubbo 前端开发 Java
maven多模块和依赖冲突问题汇总记录(上)
maven多模块和依赖冲突问题汇总记录(上)
546 0
|
Java API Maven
maven多模块和依赖冲突问题汇总记录(下)
maven多模块和依赖冲突问题汇总记录(下)
641 0
|
Java Maven
Maven 基础(二) | 解决依赖冲突的正确姿势
Maven 基础(二) | 解决依赖冲突的正确姿势
Maven 基础(二) | 解决依赖冲突的正确姿势
|
Java Maven
Maven的核心笔记(6)maven的传递、冲突、聚合
Maven项目的依赖传递 有三个项目:ABC A | B | C B是依赖A的,C又是依赖B的,所以依赖传递,C也是依赖...
879 0
|
Java Maven 数据库连接
Maven&#183;依赖范围&#183;传递依赖&#183;依赖冲突
Maven因为执行一系列编译、测试和部署运行等操作,在不同的操作下使用的classpath不同,依赖范围就是用来控制依赖与三种 classpath(编译classpath、测试classpath、运行classpath)的关系。
|
Java Apache Maven
maven 不依赖 jar(解决 jar 冲突 )
  如图找到 含有该 jar 的  配置     然后 再pom 中 exclusions 掉   org.apache.hadoop hadoop-common ${hadoop_versoin} javax.servlet.jsp jsp-api                                     捐助开发者 在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。
829 0
|
18天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
73 8
|
15天前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
39 3