zoukankan      html  css  js  c++  java
  • mavn jar包依赖冲突解决

    背景:使用maven很方便,但是引入冲突也很常见。后果很严重,各种不明实体找不到,所以需要对jar包的依赖有一个清晰的认识。

    查看冲突

    参考:用dependency:tree查看maven引入jar包的传递依赖

    maven 树 查看依赖

    查看jar包的传递依赖,最方便的方式就是打依赖树,使用mvn dependency:tree -Dverbose

    改命令在执行时候回重新build一次

    dependency:tree -Dverbose

     使用如下命令查看单个jar包的依赖

    #详细查看jar包依赖
    mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
    
    mvn dependency:tree -Dverbose -Dincludes=:notify-common

    输出结果:

    [INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile
    [INFO] +- org.apache.tomcat:tomcat-jsp-api:jar:7.0.70:compile
    [INFO] |  +- org.apache.tomcat:tomcat-el-api:jar:7.0.70:compile
    [INFO] |  - (org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile - omitted for duplicate)
    [INFO] +- net.sf.jasperreports:jasperreports:jar:5.6.0:compile
    [INFO] |  +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for conflict with 1.8.3)
    [INFO] |  +- commons-collections:commons-collections:jar:3.2.1:compile
    [INFO] |  +- commons-digester:commons-digester:jar:2.1:compile
    [INFO] |  |  +- (commons-beanutils:commons-beanutils:jar:1.8.3:compile - omitted for duplicate)
    [INFO] |  |  - (commons-logging:commons-logging:jar:1.1.1:compile - omitted for duplicate)

    递归依赖的关系列的算是比较清楚了,每行都是一个jar包,根据缩进可以看到依赖的关系。

    • 最后写着compile的就是编译成功的。
    • 最后写着omitted for duplicate的就是有jar包被重复依赖了,但是jar包的版本是一样的。
    • 最后写着omitted for conflict with xxxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。比如上面有一行最后写着omitted for conflict with 1.8.3,那么该行的commons-beanutils:jar:1.8.0不会被引入,只有1.8.3版本的会被引入。

    解决重复依赖和冲突的方法:

    1,修改pom文件中两个dependency元素的位置。如果两个dependency都引用了一个jar包,但是版本不同,classloader只会加载jar包在pom文件中出现的第一个版本,以后出现的其他版本的jar包会被忽略。

    不建议使用该方法,因为引用不同版本的jar包本身就是很危险的。

    2,使用<exclusions>标签来去掉某个dependency依赖中的某一个jar包或一堆jar包,<exclusion>中的jar包或者依赖的相关jar包都会被忽略,从而在两个dependency都依赖某个jar包时,可以保证只使用其中的一个。

    可以这么写:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.8.3.2</version>
        <exclusions>
            <exclusion>
                <artifactId>guava</artifactId>
                <groupId>com.google.guava</groupId>
            </exclusion>
            <exclusion>
                <artifactId>spring</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>    
        </exclusions>
    </dependency>

    我们会遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException 之类的运行时异常,从经验上我们就会判断,Jar包冲突了。解决Jar包冲突问题,每个人都有每个人的方法,这里我介绍一下我的方法,供大家参考。

    问题解决

    对于maven问题,一般解决方式是

    1 查看依赖树,解决冲突

    2 编译,缺什么jar包就添加什么jar包(亲身体会)

    最佳解决办法:

    idea安装maven helper插件。如果出现jar包冲突,点击工程的pom文件,选择conflict,刷新,即可看到冲突的jar包。

    这里有1.2 和1.9两个冲突的版本,只需要将低版本exclude就可以了。easy

  • 相关阅读:
    RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
    x 的平方根--二分查找
    责任链模式--设计模式
    迭代器模式--设计模式
    组合模式--设计模式
    搜索旋转排序数组II
    搜索旋转排序数组--二分查找
    搜索插入位置--二分查找
    越狱详解与调试--逆向开发
    有序链表转换二叉搜索树--链表
  • 原文地址:https://www.cnblogs.com/lixuwu/p/11161707.html
Copyright © 2011-2022 走看看