最近在一次gradle
同步后,突然编译报错,看一下错误原因,是引用库冲突了,截取信息如下。
> 1 exception was raised by workers:
java.lang.RuntimeException: Duplicate class net.lingala.zip4j.core.HeaderReader found in modules classes.jar (com.tsing.croods.components:croods-cmpt-zip:1.3.8) and zip4j-1.3.2.jar (net.lingala.zip4j:zip4j:1.3.2)
从上面的信息可以看出来,是引用net.lingala.zip4j:zip4j
冲突了。
针对这种情况我们可以在gradle
中implementation
时使用exclude
关键词来排除net.lingala.zip4j:zip4j
,但是第一步需要知道到底是哪个库引用到这个库了。
项目中引用的库很多,不可能人工一个一个去排查,好在gradle
有为我们提供了这样的指令来查看依赖库。
以下指令就是来查找项目中哪些库有依赖到net.lingala.zip4j:zip4j
。
./gradlew :app:dependencyInsight --configuration debugCompileClasspath --dependency net.lingala.zip4j:zip4j
输入指令回车后就会得到以下信息:
net.lingala.zip4j:zip4j:1.3.2
variant "compile" [
org.gradle.status = release (not requested)
org.gradle.usage = java-api
org.gradle.category = library (not requested)
Requested attributes not found in the selected variant:
com.android.build.api.attributes.BuildTypeAttr = debug
com.android.build.gradle.internal.dependency.AndroidTypeAttr = Aar
]
Selection reasons:
- By constraint : debugRuntimeClasspath uses version 1.3.2
net.lingala.zip4j:zip4j:{strictly 1.3.2} -> 1.3.2
\--- debugCompileClasspath
net.lingala.zip4j:zip4j:1.3.2
\--- com.tsing.syncdata:syncdata:1.0.1.1-SNAPSHOT:20210825.112636-153
\--- debugCompileClasspath
从上面的信息就很直观的发现是com.tsing.syncdata:syncdata
这个库有依赖net.lingala.zip4j:zip4j
。那我们就可以使用exclude
关键词了。具体如下:
implementation('com.tsing.syncdata:syncdata:1.0.1.1-SNAPSHOT', {
exclude group: 'net.lingala.zip4j', module: 'zip4j'
})
PS:
- 如果你想查看所有的依赖树,则需要使用
dependencies
指令:
./gradlew :app:dependencies --configuration debugCompileClasspath
- 指令前的
:app
是你的module
名configuration
参数用于指定variant
,例如你还可以传入releaseCompileClasspath