zoukankan      html  css  js  c++  java
  • gradle依赖冲突

    # 如何定位依赖冲突?

    • 了解如何定位依赖冲突问题之前,我们先手动制造一个依赖冲突。

    我们在 build.gradle 引入两个依赖库:

    compile 'org.hibernate:hibernate-core:3.6.3.Final'
    compile 'org.slf4j:slf4j-api:1.7.22'
    

    执行一下命令查看依赖报告:

    ./gradlew :module:dependencies --configuration compile
    

    Gradle 执行结果:

    compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
    +--- org.hibernate:hibernate-core:3.6.3.Final
    |    +--- antlr:antlr:2.7.6
    |    +--- commons-collections:commons-collections:3.1
    |    +--- dom4j:dom4j:1.6.1
    |    +--- org.hibernate:hibernate-commons-annotations:3.2.0.Final
    |    |    --- org.slf4j:slf4j-api:1.5.8 -> 1.7.22(版本自动提升)
    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final
    |    +--- javax.transaction:jta:1.1
    |    --- org.slf4j:slf4j-api:1.6.1 -> 1.7.22(版本自动提升)
    --- org.slf4j:slf4j-api:1.7.22
    

    从上面的执行结果可以看出:Gradle 在构建时,默认会使用最高版本的库,例如依赖 slf4j 最终都会以最高的版本为主。

    • Configuration 配置依赖问题

    我们前面介绍过,每一个 dependency 依赖都是 Configuration ,那么我们可以遍历ConfigurationContainer,获取 每一个 Configuration 对象,然后处理对应的依赖冲突问题。

    下面我们配置,当 Gradle 构建遇到依赖冲突时,就立即构建失败:

    configurations.all() {
        Configuration configuration ->
            //当遇到版本冲突时直接构建失败
            configuration.resolutionStrategy.failOnVersionConflict()
    }
    

    在点击 build 时,会出现如下错误:

     
    Gradle依赖冲突

    # 如何解决依赖冲突?

    在上面依赖的两个库导致的依赖冲突是因为 slf4j 的版本不同导致的,那么我们知道原因之后就可以在依赖时指定不要传入依赖某一个库即可,下面来演示一下如何操作:

    方式1:

    • 排除传递依赖
    compile 'org.slf4j:slf4j-api:1.7.22'
    compile ('org.hibernate:hibernate-core:3.6.3.Final'){
        //排除某一个库(slf4j)依赖
        exclude group: 'org.slf4j',module: 'slf4j-api'
    }
    
    • 下面就是排除传递依赖后的结果:
    compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
    +--- org.slf4j:slf4j-api:1.7.22
    --- org.hibernate:hibernate-core:3.6.3.Final
         +--- antlr:antlr:2.7.6
         +--- commons-collections:commons-collections:3.1
         +--- dom4j:dom4j:1.6.1
         +--- org.hibernate:hibernate-commons-annotations:3.2.0.Final
         +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final
         --- javax.transaction:jta:1.1
    
    
    • 指定禁止传递依赖
    compile('org.hibernate:hibernate-core:3.6.3.Final') {
        //指定禁止传递依赖
        transitive false
    }
    compile 'org.slf4j:slf4j-api:1.7.22'
    
    • 查看依赖报告
    compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
    +--- org.hibernate:hibernate-core:3.6.3.Final
    --- org.slf4j:slf4j-api:1.7.22
    
    

    方式2:

    • 当遇到依赖冲突时,指定一个版本号
    configurations.all() {
        Configuration configuration ->
            configuration.resolutionStrategy.force(['org.slf4j:slf4j-api:1.6.1'])
            
            //或者这样写
            resolutionStrategy.setForcedModules(['org.slf4j:slf4j-api:1.6.1'])
    }


    作者:未见哥哥
    链接:https://www.jianshu.com/p/82de510b40b9
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    tomcat work 目录
    上传图片预览 支持IE8+,FF,Chrome ,保留原图片比例
    设计模式学习笔记-观察者模式
    jcarousellite 实现图片列表滚动
    linux一些常用命令
    http&https&证书&数字签名
    醉笑陪君三万场 不诉离伤
    笔记本光驱位安装固态硬盘及window系统一些过程记录
    linux 添加定时任务脚本
    设置 SSH 免密码登陆——仍提示输入密码
  • 原文地址:https://www.cnblogs.com/daxiong225/p/12549625.html
Copyright © 2011-2022 走看看