Avatar ·

Ошибка KaptExecution при сборке проекта Android/Kotlin: как исправить?

Всем привет! Я новичок в Android-разработке на Kotlin, и уже вторую неделю мучаюсь с одной и той же ошибкой при сборке проекта. Использую Android Studio, проект включает Room и Dagger (через kapt). Вот полный лог ошибки: ``` A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution > java.lang.reflect.InvocationTargetException (no error message) ``` Стек трейс показывает что-то про «javax.annotation.processing.Processor», но я не могу понять, в чём дело. Мой build.gradle (app-level) выглядит так: ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") } android { compileSdk = 34 defaultConfig { applicationId = "com.example.myapp" minSdk = 26 targetSdk = 34 } } dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.dagger:dagger:2.50") kapt("com.google.dagger:dagger-compiler:2.50") implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") } ``` Я перепробовал уже всё: чистил кеш (./gradlew clean), пересобирал проект, обновлял версии зависимостей, даже переустанавливал Android Studio. Ошибка появляется при каждой сборке. Подскажите, что я делаю не так? Заранее спасибо! <<>>

Причина ошибки и основное решение

Ошибка KaptExecution с InvocationTargetException почти всегда связана с конфликтами версий процессоров аннотаций (kapt) или несовместимостью библиотек. В вашем случае типичная проблема — использование устаревшей или несовместимой версии Dagger с Room, либо отсутствие явного указания версии Kotlin и KSP.

Вот пошаговый план исправления (работает в 90% случаев):

Шаг 1. Обновите Kotlin и плагины до актуальных версий

В корневом build.gradle (project-level) убедитесь, что версия Kotlin соответствует AGP (Android Gradle Plugin). Для compileSdk 34 рекомендую:

plugins {
    id("com.android.application") version "8.2.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
}

Шаг 2. Явно укажите версию Kotlin для kapt

Добавьте в build.gradle (app-level) блок kapt с конфигурацией:

kapt {
    correctErrorTypes = true
    useBuildCache = true
}

Шаг 3. Проверьте совместимость Dagger и Room

Dagger 2.50 требует Kotlin 1.9+ и AGP 8.2+. Room 2.6.1 совместим с Dagger 2.50, но иногда возникает конфликт из-за разных версий javax.inject. Добавьте явную зависимость:

dependencies {
    // ... ваши зависимости ...
    implementation("javax.inject:javax.inject:1")
    // Убедитесь, что kapt-зависимости имеют одинаковую версию Kotlin
    kapt("com.google.dagger:dagger-compiler:2.50")
    kapt("androidx.room:room-compiler:2.6.1")
}

Шаг 4. Полная очистка и пересборка

Выполните команды в терминале:

./gradlew clean
./gradlew build --stacktrace

Шаг 5. Альтернатива: перейдите на KSP (Kotlin Symbol Processing)

KSP — более быстрая и стабильная замена kapt. Для Room это особенно актуально. Замените плагин и зависимости:

// Вместо kotlin-kapt используйте:
plugins {
    id("com.google.devtools.ksp") version "1.9.22-1.0.17"
}

dependencies {
    // Вместо kapt("androidx.room:room-compiler:2.6.1")
    ksp("androidx.room:room-compiler:2.6.1")
    // Dagger пока оставьте на kapt, но можно и его перевести на KSP через Anvil
}

Почему это работает?

Ошибка KaptExecution возникает, когда процессор аннотаций (например, Dagger или Room) не может загрузиться из-за несовместимости версий Kotlin или отсутствия необходимых классов в classpath. Явное указание javax.inject и использование KSP устраняет эти конфликты.

После этих шагов ошибка должна исчезнуть. Если нет — проверьте, нет ли в вашем коде аннотаций, которые не поддерживаются (например, @Inject в неправильном месте).

<<>>

Дополнительный совет: проверьте конфигурацию Gradle JVM

Иногда ошибка KaptExecution возникает из-за того, что Gradle использует неправильную версию JDK. Убедитесь, что в gradle.properties указана версия JDK 17 или 21 (для AGP 8.x):

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.jetifier.ignorelist=javax.annotation

Также проверьте в настройках Android Studio (File → Settings → Build, Execution, Deployment → Build Tools → Gradle), что используется Gradle JDK версии 17 (не 11 и не 20).

Если проблема остаётся — попробуйте временно отключить Dagger и собрать проект только с Room. Если сборка пройдёт успешно, значит проблема именно в Dagger. В таком случае обновите Dagger до 2.51 (вышла в апреле 2024) или переведите его на KSP через библиотеку Anvil от Square.