Android项目guava包重复类com.google.common报错无法运行如何解决
你遇到的报错内容如下:
模块jetified-guava-27.1-android (com.google.guava:guava:27.1-android) 与 jetified-guava-jdk5-17.0 (com.google.guava:guava-jdk5:17.0) 中存在大量重复类,包含com.google.common.annotations.Beta、com.google.common.annotations.GwtCompatible、com.google.common.base.Absent、com.google.common.base.AbstractIterator、com.google.common.base.Ascii、com.google.common.base.CaseFormat、com.google.common.base.CharMatcher等全系列com.google.common包下的同名类
核心原因
项目的传递依赖同时引入了两个不同分支的Guava库:com.google.guava:guava:27.1-android 是适配高版本JDK/Android环境的主流维护版本,com.google.guava:guava-jdk5:17.0 是已停止维护的JDK5兼容分支,二者包名完全一致导致类重复冲突。
解决方案
可根据项目技术栈选择对应处理方式:
方案1:全局排除废弃的guava-jdk5(推荐)
该方案适配绝大多数场景,直接移除无维护价值的旧分支依赖即可:
Gradle项目配置
在根目录build.gradle的allprojects配置块中添加规则:
allprojects { configurations { all { // 全局排除已废弃的guava-jdk5分支 exclude group: 'com.google.guava', module: 'guava-jdk5' } } }
Maven项目配置
在pom.xml的dependencyManagement节点中添加规则:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava-jdk5</artifactId> <version>17.0</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>
方案2:全局锁定Guava版本
如果需要保留统一版本的Guava,可强制指定项目内所有Guava依赖的版本:
Gradle项目配置
allprojects { configurations.all { resolutionStrategy { // 强制全局使用指定版本的Guava force 'com.google.guava:guava:27.1-android' } } }
Maven项目配置
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.1-android</version> </dependency> </dependencies> </dependencyManagement>
方案3:针对性排除传递依赖
如果全局调整存在兼容性风险,可以先定位guava-jdk5的引入来源,再做定向排除:
- Gradle项目执行命令查询依赖树:
./gradlew dependencies | grep guava-jdk5 - Maven项目执行命令查询依赖树:
mvn dependency:tree | grep guava-jdk5
找到引入guava-jdk5的父依赖后,仅在该依赖的声明中添加排除规则即可,Gradle示例:
dependencies { implementation('对应父依赖的groupId:artifactId:版本号') { exclude group: 'com.google.guava', module: 'guava-jdk5' } }
生效验证
配置完成后重新执行项目构建,检查依赖树确认仅存在一个Guava版本,即可解决重复类报错。
内容的提问来源于stack exchange,提问作者Twinkle

