Avatar ·

Ошибка "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:

  1. В корневом build.gradle добавьте плагин KSP:
plugins {
    id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false
}
  1. В файле модуля 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() и ускорит сборку.