Einleitung: Warum KaptExecution den Build zerstört und wie man es behebt
\n\nWenn Sie jemals auf den Fehler A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution gestoßen sind, wissen Sie, wie aus der Bahn werfend das sein kann. Der Build stürzt ab, Gradle zeigt roten Text an und in den Logs befinden sich unverständliche Stacktraces. Auf Stack Overflow hat diese Frage tausende Aufrufe, aber die meisten Antworten sind nur "versuche, den Cache zu leeren". Wir gehen weiter.
In diesem Artikel geben wir nicht nur fertige Lösungen. Wir schauen unter die Haube des Kapt-Mechanismus (Kotlin Annotation Processing Tool) und analysieren, was genau passiert, wenn Gradle KaptExecution ausführt. Sie erfahren, wie die Codegenerierung funktioniert, wo sich typische Fehler verstecken und wie man sie verhindert. Und vor allem erhalten Sie funktionierende Beispiele in Kotlin, die Sie sofort in Ihrem Projekt anwenden können.
Dies ist ein Lehrmaterial für pythonlib.ru, angepasst für Entwickler, die nicht nur Befehle kopieren, sondern verstehen wollen, was im Builder vor sich geht.
\n\nWas ist KaptExecution und wozu wird es benötigt
\n\nKapt ist ein Plugin für Kotlin, das die Verwendung von Java-kompatiblen Annotation Processors (z. B. Dagger, Room, Glide, Moshi) in Kotlin-Projekten ermöglicht. Wenn Sie eine Annotation wie @Inject oder @Entity schreiben, generiert der Compiler zusätzlichen Code (Klassen, Fabriken, DAOs).
Innerhalb von Gradle arbeitet Kapt als separate Aufgabe. Wenn Sie den Build starten, ruft Gradle KaptExecution auf – dies ist der Befehl, der den Kotlin-Compiler mit aktiviertem Annotation Processing startet. Wenn in dieser Phase etwas schiefgeht (z. B. der Processor eine Exception wirft oder der Speicher ausgeht), sehen Sie genau diesen Fehler.
Wie KaptExecution in Gradle aussieht
\n\nIn der Datei build.gradle.kts (oder build.gradle) wird Kapt wie folgt eingebunden:
plugins {\n kotlin("kapt") version "1.9.0"\n}\n\ndependencies {\n kapt("com.google.dagger:dagger-compiler:2.48")\n}\n\n\nWenn Sie ./gradlew build ausführen, erstellt Gradle einen untergeordneten Java/Kotlin-Prozess, der KaptExecution ausführt. In diesem Moment werden die Annotation Processors geladen, Annotationen geparst und Dateien im Ordner build/generated/source/kapt generiert.
Hauptursachen für den KaptExecution-Fehler
\n\nDer Fehler kann durch verschiedene Faktoren verursacht werden. Betrachten wir die häufigsten Szenarien.
\n\n1. Versionskonflikt zwischen Kotlin und Kapt
\n\nKapt ist Teil des Kotlin Gradle Plugin. Wenn die Version des Plugins nicht mit der Kotlin-Version übereinstimmt, kann der Processor abstürzen. Zum Beispiel:
\n\n// Falsch\nplugins {\n kotlin("jvm") version "1.8.20"\n kotlin("kapt") version "1.9.0" // Konflikt\n}\n\n\nLösung: Die Versionen müssen übereinstimmen.
\n\n2. Nicht genügend Speicher für das Annotation Processing
\n\nKaptExecution startet einen separaten JVM-Prozess. Wenn Sie viele Annotationen verarbeiten (z. B. Room mit Dutzenden von Entitäten), könnte der Heap nicht ausreichen. In den Logs sehen Sie OutOfMemoryError.
Lösung: Erhöhen Sie den Speicher für den Gradle-Daemon in gradle.properties:
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m\nkapt.use.worker.api=false\n\n\n3. Fehler im Annotation Processor
\n\nManchmal enthält der Processor selbst (z. B. eine alte Version von Dagger oder Room) Fehler. Diese treten nur bei bestimmten Codestrukturen auf.
\n\nBeispiel: Eine zirkuläre Abhängigkeit in Dagger kann einen StackOverflowError innerhalb von KaptExecution verursachen.
// Beispiel für problematischen Code\n@Module\nclass MyModule {\n @Provides\n fun provideA(b: B): A = A(b)\n\n @Provides\n fun provideB(a: A): B = B(a) // zirkuläre Abhängigkeit\n}\n\n\nKaptExecution wird mit der Meldung Circular dependency detected abstürzen. Lösung: Das Abhängigkeitsdiagramm neu entwerfen.