gradle依赖冲突的解决方式以及开发中遇到的相关问题

查找整个项目依赖关系树

要想查看整个项目的依赖传递关系,使用命令:

gradlew :app:dependencies --configuration releaseRuntimeClasspath

其中app是项目的模块名称

运行以后查找结果中的含义如下

  • x.x.x (*) 该依赖已经有了,将不再重复依赖
  • x.x.x -> x.x.x 该依赖的版本被箭头所指的版本代替
  • x.x.x -> x.x.x(*) 该依赖的版本被箭头所指的版本代替,并且该依赖已经有了,不再重复依赖

gradle依赖冲突的解决方式

  • exclude关键字
implementation('androidx.constraintlayout:constraintlayout:1.1.3') {
    //解决冲突第一种排除方式
    exclude group: 'androidx.constraintlayout', module: 'constraintlayout-solver'
}
  • configuration配置
//定义配置名称
configurations {
    //自定义配置名称
    abc {
        println 'abc'
    }
    //第二种方式解决冲突
    configuration {
        all*.exclude module: 'annotation'
    }
    //第三种方式解决冲突,强制指定
    all {
        resolutionStrategy {
            force 'androidx.fragment:fragment:1.0.0'
        }
    }
}
  • 强制指定
//第三种方式解决冲突,强制指定
configurations.all {
    resolutionStrategy {
        force 'androidx.fragment:fragment:1.0.0'
    }
}
  • transitive属性
implementation('com.google.android.material:material:1.1.0') {
    //解决冲突第四种,false排除传递依赖,true:不排除传递依赖
    transitive false
}

java.lang.NoSuchMethodError

在当前项目开发过程中引入了了腾讯云对象存储COS的库文件之后,

implementation 'com.tencent.qcloud:cosxml:5.5.5'

项目死活都跑不起来;报了以下的错误:

完整的错误日志如下:

 java.lang.NoSuchMethodError: No virtual method getHttpUrlChecked(Ljava/lang/String;)Lokhttp3/HttpUrl; in class Lokhttp3/internal/Internal; or its super classes (declaration of 'okhttp3.internal.Internal' appears in /data/app/com.hlm.wohe-XpG2pwvZh31wjFos-V_Pcw==/base.apk!classes4.dex)
        at okhttp3.internal.huc.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:358)
        at okhttp3.internal.huc.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:343)
        at okhttp3.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:412)
        at okhttp3.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:551)
        at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:110)
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)

这里报的是java.lang.NoSuchMethodError异常,,okhttp3库文件方法找不到,可能的原因就是引用了最新的库文件,找不到这个方法,所以要去除重复的库。
在这里插入图片描述
这个时候就变成了解决okhttp3库文件重复引用的问题;操作如下
运用exclude group 关键字就可以

    implementation ('com.tencent.qcloud:cosxml:5.5.5'){	//所加的第三方框架
        exclude group:'com.squareup.okhttp3', module: 'okhttp' // 加载时排除框架中的okhttp包
    }

这样不用框架中的okhttp包,而用自己项目中的okhttp包

另附:

More than one file was found with OS independent path ‘META-INF/DEPENDENCIES’

在这里插入图片描述
大概意思就是工程生成了不止一个META-INF/DEPENDENCIES文件,看起来是因为多个 jar 包里包含了同样的文件(DEPENDENCIES.txt),导致打包时因为担心相互覆盖问题而提示出错,在module的build.gradle中加入如下配置项:

		 packagingOptions {
		        exclude 'proguard-project.txt'
		        exclude 'project.properties'
		        exclude 'META-INF/LICENSE.txt'
		        exclude 'META-INF/LICENSE'
		        exclude 'META-INF/NOTICE.txt'
		        exclude 'META-INF/NOTICE'
		        exclude 'META-INF/DEPENDENCIES.txt'
		        exclude 'META-INF/DEPENDENCIES'
		    }

Duplicate class

Duplicate class org.apache.commons.logging.Log found in modules jetified-commons-logging-1.1 (commons-logging:commons-logging:1.1.1) and jetified-commons-logging-api-1.1 (commons-logging:commons-logging-api:1.1)
在这里插入图片描述
解决方法:
第一步 :

在Terminal运行 gradlew app:dependencies 命令

第二步 :

(ctrl+F)或者右键Find 去搜索commons-logging:commons-logging或者commons-logging:commons-logging-api
在这里插入图片描述
添加如下操作

    implementation ('com.github.junrar:junrar:0.7'){
        exclude group:'commons-logging',module:'commons-logging'
    }
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android Gradle 是 Android 开发使用的构建工具,用于管理项目依赖库和构建过程。在 Android Gradle ,可以通过在 build.gradle 文件声明依赖来管理项目所需的第三方库。 首先,要避免重复依赖,可以通过以下几种方式解决: 1. 使用 implementation 替代 compile: 在构建文件,使用 implementation 来声明依赖而不是 compile。implementation 会自动解决版本冲突,并排除掉传递性依赖的冗余依赖。 2. 使用 exclude 指令: 如果遇到了冗余的依赖,可以使用 exclude 指令来排除掉特定的依赖项。在依赖声明添加 exclude 指令,指定要排除的库名称和组织。 3. 使用统一的依赖版本: 可以在项目的 root build.gradle 文件定义一个变量来统一管理依赖的版本,然后在所有的 module 的 build.gradle 文件引用这个变量。 另外,如果希望忽略某个依赖,可以使用以下方式: 1. 使用 implementation 进行依赖声明: 如果在某个 module 的 build.gradle 文件使用 implementation 来声明依赖,那么该依赖将不会传递给该 module 的依赖项。 2. 使用 exclude group 指令: 如果希望忽略某个库的所有依赖,可以在依赖声明使用 exclude group 指令来排除掉某个组织的所有依赖。 总结来说,Android Gradle 提供了一些方法来管理和解决依赖冲突问题,包括使用 implementation 替代 compile,使用 exclude 指令去除重复依赖,使用统一的依赖版本,以及使用 implementationexclude group 进行依赖的忽略。通过合理地使用这些方式,可以有效地管理依赖库并避免不必要的冲突和重复依赖
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值