使用Paging Library 3时Gradle报Kotlin协程重复类错误的问题咨询
项目构建报错场景说明
- 已完成Paging Library 3全流程接入(包含自定义PagingSource、Flow数据流配置),但项目无法正常构建运行
- 构建阶段抛出kotlinx.coroutines包下类重复定义错误:版本为1.4.1的kotlinx-coroutines-core-jvm模块中,AbstractCoroutine、Active、AwaitAll等多个协程核心类,同时被kotlinx-coroutines-core-jvm:1.4.1、kotlinx-coroutines-core:1.4.1两个依赖路径重复加载
- 当前项目已配置的核心关联依赖:
kotlinx-coroutines-android:1.4.1kotlinx-coroutines-core:1.4.1androidx.paging:paging-runtime-ktx:3.0.0-alpha12- 依赖协程能力实现的图片压缩库
id.zelory:compressor:3.0.0
- 已尝试的无效操作与验证结论:
- 曾尝试在引入paging依赖时配置排除kotlinx-coroutines-core-jvm模块,因Gradle依赖配置语法格式错误,触发app模块评估失败,提示找不到对应依赖配置方法
- 测试验证:使用完全相同依赖配置的raywenderlich教程示例项目可正常运行,降级切换到Paging Library v2版本可规避该报错,但因需要使用Paging 3新特性,无法采用降级方案
报错根因
- 问题本质是kotlinx-coroutines 1.4.x版本的构件拆分历史兼容问题:1.4.x版本开始协程将核心库拆分为平台专属构件,
kotlinx-coroutines-core为聚合依赖,会传递引入同版本的kotlinx-coroutines-core-jvm构件 - paging-runtime-ktx:3.0.0-alpha12、compressor:3.0.0这类库在对应版本的适配中,没有统一走聚合依赖的引入路径,而是直接硬编码引入了
kotlinx-coroutines-core-jvm作为直接依赖 - 当项目同时显式声明了
kotlinx-coroutines-core:1.4.1,又通过paging、compressor的依赖链引入同版本的kotlinx-coroutines-core-jvm时,Gradle依赖解析环节会把两个同版本、同内容的构件同时纳入最终打包路径,直接触发类重复定义报错 - 之前的排除操作生效失败,是因为排除规则的写法不符合Gradle依赖配置语法,没有正确将重复加载的jvm子模块从传递依赖链路中剔除
可直接落地的解决步骤
- 修正Gradle依赖配置语法,从paging、compressor的传递依赖链路中,剔除重复加载的
kotlinx-coroutines-core-jvm模块,正确写法参考:dependencies { // 显式声明协程依赖,保持版本固定 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" // 为paging依赖配置正确的排除规则 implementation("androidx.paging:paging-runtime-ktx:3.0.0-alpha12") { exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-core-jvm" } // 为compressor库配置相同的排除规则,避免重复加载 implementation("id.zelory:compressor:3.0.0") { exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-core-jvm" } } - 增加全局协程版本强制约束,避免不同依赖传递引入版本不一致的协程构件,可在app模块build.gradle的最外层添加配置:
configurations.all { // 强制锁定协程版本,消除版本差异导致的解析冲突 resolutionStrategy.force "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" resolutionStrategy.force "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1" } - 构建完成后验证依赖加载结果:
执行Gradle依赖查询命令./gradlew app:dependencies --configuration releaseRuntimeClasspath | grep kotlinx-coroutines,确认输出结果中,kotlinx-coroutines-core-jvm仅作为kotlinx-coroutines-core的传递依赖出现,不存在被paging、compressor直接引入的重复加载路径
内容的提问来源于stack exchange,提问作者DaniiarR
相关产品推荐
相关产品推荐

