Skip to content

Kotlin 依赖冲突:Duplicate class 错误解决方案

问题描述

在 Kotlin Android 项目中编译时遇到 "Duplicate class" 错误,根源在于同时引入了不兼容版本的 Kotlin 依赖库。具体表现为:kotlin-stdlib-1.8.0kotlin-stdlib-jdk7/8-1.6.0 同时存在,导致同一个类被多个库重复提供。

典型错误信息:

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules 
jetified-kotlin-stdlib-1.8.0 and jetified-kotlin-stdlib-jdk8-1.6.0

核心问题

从 Kotlin 1.8 开始,kotlin-stdlib-jdk7kotlin-stdlib-jdk8 的功能已被整合到主库 kotlin-stdlib 中。当项目同时引用了新旧版本时,就会产生冲突。

解决方案

最佳实践方案(推荐)

1. 更新 Kotlin 插件版本

在项目根目录的 build.gradle 文件中更新 Kotlin 插件版本至 1.8.0+

groovy
// 项目根目录 build.gradle
plugins {
    id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}

2. 移除冗余依赖

删除模块(app)级 build.gradle 中的 kotlin-stdlib-jdkX 显式引用:

diff
dependencies {
    // 删除下面两行
-   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0"
-   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0"
}

3. 添加版本约束(可选)

防止其他库引入旧版本依赖:

groovy
dependencies {
    constraints {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
            because("JDK7 扩展已包含在主库中")
        }
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
            because("JDK8 扩展已包含在主库中")
        }
    }
}

替代解决方案

方案A:使用 Kotlin BOM 统一版本

添加 BOM 依赖自动管理版本:

groovy
dependencies {
    implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
}

方案B:强制指定依赖版本

groovy
configurations.all {
    resolutionStrategy {
        force 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0'
    }
}

完整修复示例

groovy
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android' // 继承根项目版本
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.9.0'
    // 其他依赖...
    
    // 添加 BOM 统一管理
    implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
    
    // 固定 core-ktx 版本(避免动态版本)
    implementation 'androidx.core:core-ktx:1.10.1'
}

解决步骤

  1. 修改项目根目录的 build.gradle 更新 Kotlin 版本
  2. 删除模块级 build.gradle 中的 kotlin-stdlib-jdkX 依赖
  3. 在模块级添加 BOM 或约束
  4. 同步 Gradle(Sync Project)
  5. 清理构建:Build > Clean Project
  6. 重新构建:Build > Rebuild Project

验证是否成功

运行命令查看依赖树:

bash
./gradlew :app:dependencies --configuration releaseRuntimeClasspath

检查输出中是否有冲突的 kotlin-stdlib 版本

常见错误处理

如果升级后出现其他兼容性问题:

  1. Compose 冲突:确保 Kotlin 版本与 Compose 匹配

    groovy
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.6" // 对应 Kotlin 1.8.20
    }
  2. 动态版本问题:修改 core-ktx:+ 为固定版本

    diff
    - implementation "androidx.core:core-ktx:+"
    + implementation "androidx.core:core-ktx:1.10.1"
  3. 其他库冲突:使用 Android Studio 依赖分析工具

    • 打开 View > Tool Windows > Dependencies
    • 筛选 kotlin 并检查冲突项

根本原因解析

Kotlin 版本变化
1.8.0 之前kotlin-stdlib-jdk7/8 是独立拓展库
1.8.0+JDK7/8 扩展合并到主库 kotlin-stdlib

当项目同时存在:

  • 直接/间接依赖 kotlin-stdlib-jdk7/8:1.6.x
  • Kotlin 插件 >=1.8.0 引入的 kotlin-stdlib:1.8.x 时就会产生类重复定义冲突。

不推荐的解决方式

虽然以下方法可能临时消除错误,但会引入风险:

  • 降级 Kotlin 版本(牺牲新特性)
  • 降级其他库版本(可能导致功能缺失)
  • 手动删除 .gradle/caches 文件(临时生效)

通过上述标准方案升级到统一版本后,既可解决冲突,又能保持最新特性和安全性更新。