Navigation Compose 2.6.0依赖引入后出现重复类错误求助
问题场景
在Android Studio Flamingo 2022.2.1 Patch 2中从零创建Jetpack Compose新项目,仅添加官方文档指定的Jetpack Navigation依赖:
implementation("androidx.navigation:navigation-compose:2.6.0")
无其他自定义代码或额外依赖,但构建时触发checkDebugDuplicateClasses任务失败,错误信息示例:
Execution failed for task ':app:checkDebugDuplicateClasses' A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
进一步查看错误详情,所有重复类均来自kotlin-stdlib-1.8.20和kotlin-stdlib-jdk8-1.7.20的版本冲突,比如:
> Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20)
尝试过Invalidate Cache and Restart、更新IDE及依赖版本均无效;使用dependencyInsight工具时遇到JAVA_HOME环境变量错误;改用旧版Jetpack Navigation或新建项目后自动生成的依赖变更可正常运行,但不清楚底层原因。
错误原因
Jetpack Navigation Compose 2.6.0依赖的Kotlin版本与新项目默认引入的Kotlin标准库版本不匹配,导致依赖树中同时出现了不同版本的kotlin-stdlib和kotlin-stdlib-jdk8,两者包含重复的类文件,触发Gradle的重复类检测机制。
解决方案
1. 强制统一Kotlin标准库版本
在项目根目录的build.gradle(或build.gradle.kts)中添加版本约束,强制所有模块使用同一版本的Kotlin标准库:
Groovy语法
allprojects { configurations.all { resolutionStrategy { force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.20' force 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20' } } }
Kotlin DSL语法
allprojects { configurations.all { resolutionStrategy { force("org.jetbrains.kotlin:kotlin-stdlib:1.8.20") force("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20") } } }
2. 同步Navigation依赖与项目Kotlin版本
Jetpack Navigation Compose 2.6.0要求适配Kotlin 1.8.0+版本,确保项目的Kotlin插件版本与标准库版本一致:
在项目根build.gradle中修改Kotlin插件版本:
plugins { id 'com.android.application' version '7.4.2' apply false id 'com.android.library' version '7.4.2' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false }
3. 修复JAVA_HOME后排查依赖树
确保JAVA_HOME指向Android Studio嵌入式JDK(路径通常为Android Studio安装目录/jbr),然后执行以下命令查看冲突依赖的来源:
./gradlew app:dependencyInsight --dependency kotlin-stdlib-jdk8 --configuration debugRuntimeClasspath
临时解决方法的原理
- 改用旧版Jetpack Navigation时,旧版本依赖的Kotlin版本与新项目默认版本匹配,不会引入冲突的标准库版本;
- 新建项目时,Android Studio会自动同步依赖版本,统一Kotlin标准库的版本,从而避免重复类冲突。
内容的提问来源于stack exchange,提问作者W Simm

