升级com.android.tools.build:gradle:3.5.0遇classes.jar冲突构建错误
mergeDebugJavaResource多classes.jar冲突问题 遇到这个问题我太熟了!之前升级Android Gradle插件到3.5.0时,我也踩过一模一样的坑——只要库模块依赖本地.aar文件,就会触发mergeDebugJavaResource任务失败,提示多个文件共享classes.jar路径,但3.4.2版本完全正常。这其实是AGP 3.5.0对资源合并的校验逻辑变严格了,本地aar和fileTree的组合依赖会导致重复扫描到classes.jar(有些aar本身打包时就包含了同名的jar文件)。
下面给你几个亲测有效的解决方案:
方案1:拆分本地依赖(最稳妥)
把原来的fileTree拆成单独的aar和jar依赖,避免重复匹配:
dependencies { // 单独引入本地aar文件 api fileTree(include: ['*.aar'], dir: 'libs') // 单独引入本地jar文件 api fileTree(include: ['*.jar'], dir: 'libs') // 其他依赖保持不变 implementation 'androidx.appcompat:appcompat:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
这样Gradle会分别处理aar和jar,不会把aar内部的classes.jar和外部jar重复合并。
方案2:直接排除重复的classes.jar
如果拆分后还是有冲突,可以直接在依赖配置里排除重复的classes.jar,不过要确认这个jar确实是重复冗余的,别误删了必要的类:
dependencies { api fileTree(include: ['*.aar', '*.jar'], dir: 'libs') { exclude 'classes.jar' } // 其他依赖不变... }
方案3:升级到更高版本的AGP(可选)
AGP后续的3.6.x及以上版本修复了不少这类资源合并的问题,如果你能升级的话,可以试试把插件版本升到3.6.4这类稳定版:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.6.4' } }
记得同步Gradle后,把Gradle wrapper版本也对应更新到5.6.4(比如修改gradle/wrapper/gradle-wrapper.properties里的distributionUrl为https\://services.gradle.org/distributions/gradle-5.6.4-all.zip)。
最后记得先执行「Clean Project」,再重新Build,一般就能解决问题了!
内容的提问来源于stack exchange,提问作者庄 鹏

