Ошибка "Could not find method kapt() for arguments" в Gradle при использовании Kotlin
Привет! Я новичок в Android-разработке на Kotlin и пытаюсь подключить библиотеку для работы с аннотациями (например, Dagger или Room). В документации написано, что нужно добавить плагин kapt и использовать kapt в зависимостях. Я скопировал код из примера, но Gradle выдает ошибку:
Could not find method kapt() for arguments [com.google.dagger:dagger-compiler:2.x] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
Вот мой файл build.gradle (уровень модуля app):
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 33
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
// Пытаюсь добавить Dagger
kapt 'com.google.dagger:dagger-compiler:2.44'
implementation 'com.google.dagger:dagger:2.44'
}
Я уже проверил, что Gradle и плагин Android последние. В чем может быть проблема? Почему Gradle не видит метод kapt()? Заранее спасибо за помощь!
Причина ошибки и полное решение
Ошибка "Could not find method kapt() for arguments" возникает, потому что вы не подключили плагин kotlin-kapt в файле сборки. Метод kapt() (Kotlin Annotation Processing Tool) не является стандартной функцией Gradle — он добавляется только после применения соответствующего плагина.
Вот правильная структура вашего build.gradle (уровень модуля app):
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
// Добавьте эту строку — она подключает kapt
id 'org.jetbrains.kotlin.kapt'
}
android {
compileSdk 33
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
// Теперь kapt работает
kapt 'com.google.dagger:dagger-compiler:2.44'
implementation 'com.google.dagger:dagger:2.44'
}
Пошаговое объяснение
- Плагин kotlin-kapt — это официальный плагин Kotlin, который включает поддержку обработки аннотаций. Он добавляет в Gradle DSL метод
kapt(), аналогичныйimplementation()илиapi(). - Порядок плагинов — не имеет значения, но обычно
kotlin-kaptставят послеkotlin.android. - Синхронизация — после изменения файла обязательно нажмите "Sync Now" в Android Studio или выполните команду
./gradlew cleanв терминале.
Если вы используете Kotlin DSL (build.gradle.kts)
Для файлов с расширением .kts синтаксис немного другой:
plugins {
id("com.android.application")
kotlin("android")
kotlin("kapt") // или id("org.jetbrains.kotlin.kapt")
}
android {
// ... настройки
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
kapt("com.google.dagger:dagger-compiler:2.44")
implementation("com.google.dagger:dagger:2.44")
}
Возможные дополнительные проблемы
- Версия Gradle — убедитесь, что у вас Gradle 7.0 или выше (проверьте в
gradle-wrapper.properties). - Конфликт с Java Annotation Processing — если вы раньше использовали
annotationProcessorдля Java, то для Kotlin-проектов нужно переходить наkapt. - Multi-module проекты — если у вас несколько модулей, плагин
kotlin-kaptнужно добавить в каждый модуль, где используетсяkapt().
После добавления плагина и синхронизации проекта ошибка должна исчезнуть. Если проблема осталась, попробуйте выполнить File -> Invalidate Caches and Restart в Android Studio.
Альтернативный подход: использование Kotlin Symbol Processing (KSP)
Если вы не хотите использовать kapt или сталкиваетесь с проблемами производительности, рассмотрите KSP (Kotlin Symbol Processing). KSP — это более современная и быстрая альтернатива kapt, разработанная специально для Kotlin. Она поддерживается многими библиотеками: Room, Dagger (через Anvil), Glide и другими.
Для подключения KSP вместо kapt:
- В корневом
build.gradleдобавьте плагин KSP:
plugins {
id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false
}
- В файле модуля app подключите плагин и замените
kaptнаksp:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.devtools.ksp' // вместо kotlin-kapt
}
dependencies {
implementation 'com.google.dagger:dagger:2.44'
ksp 'com.google.dagger:dagger-compiler:2.44' // вместо kapt
}
Преимущества KSP:
- Работает напрямую с Kotlin-кодом, игнорируя Java-стадию компиляции.
- В 2-3 раза быстрее kapt.
- Лучшая поддержка Kotlin-фич (например, suspend-функций).
Недостатки:
- Не все библиотеки поддерживают KSP (проверьте документацию).
- Требуется более новая версия Kotlin (1.6+).
Если ваша библиотека поддерживает KSP (например, Room начиная с версии 2.4.0), это отличная альтернатива, которая решит проблему с kapt() и ускорит сборку.