Dagger2报错:app:kaptDebugKotlin任务执行失败如何修复
问题描述
学习Android开发及基于Dagger的Android依赖注入技术时,尝试实现简单的汽车-引擎依赖注入示例,触发Execution failed for task ':app:kaptDebugKotlin'错误,核心错误日志如下:
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:kaptDebugKotlin'. > A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)
*完整错误日志已上传公开代码片段存档。
现有实现代码
Car.kt
该类依赖Engine类,仅包含run方法:
class Car @Inject constructor(private val engine: Engine) { private val TAG: String = "Car" fun run() { engine.start() Log.i(TAG, "Car Run ...") } }
Engine.kt
简单实现类,包含start方法:
class Engine @Inject constructor() { private val TAG = "Engine" fun start() { Log.i(TAG, "Engine Start") } }
CarComponent.kt
简单Dagger组件,包含getCar方法:
@Component(modules = [AndroidSupportInjectionModule::class]) interface CarComponent { fun getCar(): Car }
项目Gradle配置
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'com.google.gms.google-services' id 'kotlin-kapt' id 'kotlin-android' } android { compileSdk 32 defaultConfig { applicationId "com.mdidproject.movupapp" minSdk 21 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' // firebase implementation 'com.google.firebase:firebase-auth-ktx:21.0.6' implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0' // dagger implementation "com.google.dagger:dagger-android:2.35.1" implementation "com.google.dagger:dagger-android-support:2.17" kapt "com.google.dagger:dagger-android-processor:2.17" kapt "com.google.dagger:dagger-compiler:2.27" // testing testImplementation 'junit:junit:4.13.2' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
已尝试操作
- 多次重新构建项目,始终触发上述kaptDebugKotlin任务执行失败错误
- 将kapt引入的
com.google.dagger:dagger-android-processor:2.17与com.google.dagger:dagger-compiler:2.27替换为annotationProcessor后,报错消失但Dagger生成的组件类未正常生成
修复方案
该报错由两个明确问题导致,按以下步骤修改即可解决:
- 统一所有Dagger依赖版本
当前引入的Dagger库版本从2.17到2.35.1不等,跨版本的注解处理器与运行库API不兼容,直接触发kapt执行异常。Kotlin项目必须使用kapt处理注解,替换为annotationProcessor不会处理Kotlin代码的注解标记,自然无法生成Dagger组件类。
将依赖配置中的Dagger部分替换为以下内容,所有Dagger相关库使用完全一致的版本号:// dagger 版本统一为2.44稳定版 implementation "com.google.dagger:dagger:2.44" implementation "com.google.dagger:dagger-android:2.44" implementation "com.google.dagger:dagger-android-support:2.44" kapt "com.google.dagger:dagger-compiler:2.44" kapt "com.google.dagger:dagger-android-processor:2.44" - 修正Component配置
当前示例仅实现普通类的依赖注入,不需要引入AndroidSupportInjectionModule,该模块仅用于Dagger对Android四大组件的注入场景,多余的模块引用也会导致注解处理器校验失败。将CarComponent修改为:@Component interface CarComponent { fun getCar(): Car } - 执行缓存清理
修改完配置后,依次点击Android Studio菜单栏的Build -> Clean Project,等待清理完成后再点击Build -> Rebuild Project即可正常构建。注意你定义的组件名为CarComponent,Dagger生成的实现类名为DaggerCarComponent,并非DaggerAppComponent,调用时不要写错类名。
内容的提问来源于stack exchange,提问作者blanksix
相关产品推荐
相关产品推荐

