美文网首页
Maven解决依赖冲突

Maven解决依赖冲突

作者: 52Hetrz | 来源:发表于2020-12-01 09:18 被阅读0次

    maven依赖冲突以及解决方法

    什么是依赖冲突

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

    依赖冲突的原因

    依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突

    如何解决依赖冲突

    首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了。具体执行步骤如下

    1、查看依赖冲突

    a、通过dependency:tree是命令来检查版本冲突

    mvn -Dverbose dependency:tree
    复制代码
    

    当敲入上述命令时,控制台会出现形如下内容

    [INFO] org.example:hello:jar:1.0-SNAPSHOT
    [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
    [INFO] |  |  \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate)
    [INFO] |  +- org.springframework:spring-core:jar:5.2.7.RELEASE:compile
    [INFO] |  |  \- org.springframework:spring-jcl:jar:5.2.7.RELEASE:compile
    [INFO] |  \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile
    [INFO] |     \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate)
    [INFO] \- org.springframework:spring-aop:jar:5.2.0.RELEASE:compile
    [INFO]    +- (org.springframework:spring-beans:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)
    [INFO]    \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)
    复制代码
    

    其中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版本会被项目引用

    b、如果是idea,可以安装maven helper插件来检查依赖冲突

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

    [图片上传失败...(image-3c8f1d-1606722138046)]

    <figcaption style="display: block;"></figcaption>

    上面按钮的图标含义如下

    • Conflicts(查看冲突)
    • All Dependencies as List(列表形式查看所有依赖)
    • All Dependencies as Tree(树形式查看所有依赖)

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

    [图片上传失败...(image-7d9b90-1606722060841)]

    <figcaption style="display: block;"></figcaption>

    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>
    
        </dependencies>
    
    复制代码
    

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

    a、使用第一声明者优先原则

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

    查看依赖树

    [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包

    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>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.2.0.RELEASE</version>
            </dependency>
    
        </dependencies>
    复制代码
    

    [图片上传失败...(image-843055-1606722060841)]

    <figcaption style="display: block;"></figcaption>

    通过上图可以看到项目引入是 spring core 5.2.0的包

    c、排除依赖

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

    [图片上传失败...(image-fe7c30-1606722060841)]

    <figcaption style="display: block;"></figcaption>

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

     <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>
    
    复制代码
    

    [图片上传失败...(image-b8d69a-1606722060841)]

    <figcaption style="display: block;"></figcaption>

    通过上图可以看到项目引入是 spring core 5.2.0的包

    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>
    
    复制代码
    

    [图片上传失败...(image-33862b-1606722060841)]

    <figcaption style="display: block;"></figcaption>

    通过上图可以看到项目引入是 spring core 5.2.0的包

    总结

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

    相关文章

      网友评论

          本文标题:Maven解决依赖冲突

          本文链接:https://www.haomeiwen.com/subject/xtorwktx.html