KaptExecution em Kotlin: o que está por trás do erro do Gradle

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que o KaptExecution quebra a build e como corrigir

\n\n

Se você já se deparou com o erro A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution, sabe como isso tira do sério. A build falha, o Gradle exibe texto vermelho e nos logs — stacktraces confusos. No Stack Overflow, essa pergunta acumulou milhares de visualizações, mas a maioria das respostas é apenas "tente limpar o cache". Nós iremos além.

\n\n

Neste artigo, não vamos apenas dar soluções prontas. Vamos olhar por dentro do mecanismo Kapt (Kotlin Annotation Processing Tool) e entender exatamente o que acontece quando o Gradle executa KaptExecution. Você aprenderá como funciona a geração de código, onde se escondem os erros típicos e como preveni-los. E o principal — receberá exemplos funcionais em Kotlin que podem ser aplicados imediatamente no seu projeto.

\n\n

Este é um material educacional para pythonlib.ru, adaptado para desenvolvedores que querem não apenas copiar comandos, mas entender o que acontece dentro do builder.

\n\n

O que é KaptExecution e para que serve

\n\n

Kapt é um plugin para Kotlin que permite usar annotation processors compatíveis com Java (por exemplo, Dagger, Room, Glide, Moshi) em projetos Kotlin. Quando você escreve uma anotação @Inject ou @Entity, o compilador gera código adicional (classes, fábricas, DAOs).

\n\n

Internamente no Gradle, o Kapt funciona como uma tarefa separada. Quando você executa a build, o Gradle chama KaptExecution — este é o comando que executa o compilador Kotlin com o processamento de anotações ativado. Se algo der errado nesta etapa (por exemplo, o processor lançou uma exceção ou a memória acabou), você vê o tal erro.

\n\n

Como o KaptExecution aparece no Gradle

\n\n

No arquivo build.gradle.kts (ou build.gradle), o Kapt é adicionado assim:

\n\n
plugins {\n    kotlin("kapt") version "1.9.0"\n}\n\ndependencies {\n    kapt("com.google.dagger:dagger-compiler:2.48")\n}\n
\n\n

Quando você executa ./gradlew build, o Gradle cria um processo filho Java/Kotlin que executa KaptExecution. Neste momento, os annotation processors são carregados, as anotações são analisadas e os arquivos são gerados na pasta build/generated/source/kapt.

\n\n

Principais causas do erro KaptExecution

\n\n

O erro pode ser causado por diferentes fatores. Vamos considerar os cenários mais comuns.

\n\n

1. Conflito de versões do Kotlin e Kapt

\n\n

Kapt faz parte do Kotlin Gradle Plugin. Se a versão do plugin não corresponder à versão do Kotlin, o processor pode falhar. Por exemplo:

\n\n
// Incorreto\nplugins {\n    kotlin("jvm") version "1.8.20"\n    kotlin("kapt") version "1.9.0" // conflito\n}\n
\n\n

Solução: as versões devem coincidir.

\n\n

2. Memória insuficiente para o annotation processing

\n\n

KaptExecution executa um processo JVM separado. Se você estiver processando muitas anotações (por exemplo, Room com dezenas de entidades), o heap pode ser insuficiente. Nos logs, você verá OutOfMemoryError.

\n\n

Solução: aumente a memória para o daemon do Gradle no gradle.properties:

\n\n
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m\nkapt.use.worker.api=false\n
\n\n

3. Bugs no annotation processor

\n\n

Às vezes, o próprio processor (por exemplo, uma versão antiga do Dagger ou Room) contém erros. Eles se manifestam apenas com determinadas estruturas de código.

\n\n

Exemplo: uma dependência cíclica no Dagger pode causar StackOverflowError dentro do KaptExecution.

\n\n
// Exemplo de código problemático\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) // dependência cíclica\n}\n
\n\n

KaptExecution falhará com a mensagem Circular dependency detected. Solução — redesenhar o grafo de dependências

Blogs

Book Recommendations