升级Kotlin到1.5.20后Dagger、Moshi的kapt编译失败问题咨询
问题根因
该错误是Kotlin 1.5.x版本配套的kotlinx-metadata-jvm、kotlin-stdlib等核心库内部API变更,与当前使用的Dagger、Moshi版本的kapt注解处理器依赖的旧版本API不兼容导致。你看到的运行时依赖版本统一是正常的,但kapt注解处理器的类路径是独立于应用运行时的,androidDependencies任务无法查询到该路径下的依赖冲突。
你提到的KotlinClassHeader构造方法废弃不会直接触发报错,实际原因是kapt类路径下同时存在kotlinx-metadata-jvm:0.2.0和0.3.0版本,类加载时优先加载了无对应构造方法的0.2.0版本,才抛出NoSuchMethodError。
解决方案
按优先级从高到低尝试以下方案:
方案1:强制统一kapt类路径依赖版本
在项目根目录的build.gradle中添加以下配置,强制所有kapt处理器使用匹配Kotlin 1.5.x的依赖版本:
allprojects { configurations.all { config -> // 针对kapt类路径单独强制依赖版本 if (config.name.contains("kapt", ignoreCase = true)) { config.resolutionStrategy { force "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0" force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.21" force "org.jetbrains.kotlin:kotlin-reflect:1.5.21" } } // 全局统一所有Kotlin相关依赖版本 resolutionStrategy { eachDependency { details -> if (details.requested.group == "org.jetbrains.kotlin") { details.useVersion "1.5.21" } } } } }
配置完成后执行./gradlew clean再重新构建即可。
方案2:升级适配Kotlin 1.5.x的注解处理器版本
该方案是长期兼容的最优解,将相关依赖升级到适配版本即可:
- Dagger升级到
2.39及以上版本,该版本开始完全兼容Kotlin 1.5.x的metadata API - Moshi及moshi-kotlin-codegen同步升级到
1.13.0及以上版本 - 若项目中直接依赖了kotlinpoet,同步升级到
1.10.0及以上版本
方案3:临时降级Kotlin版本
如果以上两个方案都无法适配现有项目,可以临时将Kotlin版本回退到1.4.32,等所有依赖都完成Kotlin 1.5.x适配后再进行升级操作。
内容的提问来源于stack exchange,提问作者Beloo
相关产品推荐
相关产品推荐

