Плагин компилятора kapt
Плагин компилятора kapt позволяет использовать существующие процессоры аннотаций Java в Kotlin и работает как с Maven, так и с Gradle. Он создает файлы-заглушки из исходного кода Kotlin, а затем запускает процессоры аннотаций Java для этих заглушек.
Это позволяет использовать обработку аннотаций на основе Java в проектах Kotlin для таких библиотек, как MapStruct и Data Binding.
Настройка плагина
Вы можете настроить плагин kapt для Gradle, Maven или использовать его из командной строки.
Gradle
Чтобы использовать kapt в Gradle, выполните следующие действия:
-
Примените плагин Gradle
kaptв файле сценария сборкиbuild.gradle(.kts):plugins { kotlin("kapt") version "2.4.20" }plugins { id "org.jetbrains.kotlin.kapt" version "2.4.20" } -
Добавьте соответствующие зависимости с помощью конфигурации
kaptв блокеdependencies {}:dependencies { kapt("groupId:artifactId:version") }dependencies { kapt 'groupId:artifactId:version' } -
Если ранее вы использовали поддержку Android для процессоров аннотаций, замените использование конфигурации
annotationProcessorнаkapt. Если проект содержит классы Java, плагин kapt обрабатывает и их.Если вы используете процессоры аннотаций для исходного кода
androidTestилиtest, соответствующие конфигурацииkaptназываютсяkaptAndroidTestиkaptTest. Обратите внимание, чтоkaptAndroidTestиkaptTestрасширяютkapt, поэтому можно указать зависимостьkapt, и она будет доступна как для исходного кода приложения, так и для тестов.
Maven
Вы можете настроить kapt, используя параметр <extensions> для упрощения настройки или выполнив ее вручную, чтобы полностью контролировать выполнение kapt.
Автоматическая настройка
Настроить kapt можно проще, включив параметр <extensions> для плагина Kotlin Maven. В этом случае не нужно вручную настраивать раздел <execution> kapt, указывая цели или исходные каталоги.
Чтобы настроить kapt автоматически, установите для параметра <extensions> значение true для kotlin-maven-plugin в файле сборки pom.xml:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<extensions>true</extensions>
<configuration>
<annotationProcessorPaths>
<!-- Specify your annotation processors here -->
<annotationProcessorPath>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.3</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</plugin>
Дополнительные сведения о параметре <extensions> см. в разделе Автоматическая настройка.
Настройка вручную
Чтобы настроить kapt вручную в проекте Kotlin Maven, добавьте выполнение цели kapt из kotlin-maven-plugin перед выполнением compile:
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<!-- Specify your annotation processors here -->
<annotationProcessorPath>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.3</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
Чтобы настроить режим обработки аннотаций, задайте параметр aptMode в блоке <configuration>. Например:
<configuration> ... <aptMode>stubs</aptMode> </configuration>
CLI
kapt доступен как автономный инструмент CLI в бинарном дистрибутиве компилятора Kotlin.
Чтобы запустить kapt из командной строки, используйте:
kapt <options> <source files>
Например:
kapt -Kapt-mode=stubsAndApt \ -Kapt-sources=build/kapt/sources \ -Kapt-classes=build/kapt/classes \ -Kapt-stubs=build/kapt/stubs \ -Kapt-classpath=lib/ap.jar \ -Kapt-classpath=lib/anotherAp.jar \ src/main/kotlin
См. полный список параметров компилятора, относящихся к kapt.
Также можно передать все допустимые параметры компилятора Kotlin. Выполните
kotlinc -help, чтобы просмотреть их.
Настройка процессоров аннотаций
kapt предоставляет параметры для управления обнаружением, организацией и выполнением процессоров аннотаций, включая управление путем к классам процессоров, наследование процессоров из общих конфигураций и сохранение активности процессоров, предназначенных для javac.
Дополнительные параметры настройки, например передача параметров процессорам аннотаций и javac, см. в разделе Настройка процессоров аннотаций.
Настройка пути к классам и обнаружения процессоров
Можно отключить обнаружение процессоров аннотаций, не включенных в путь к классам процессоров kapt. Это исключает ненужные процессоры аннотаций из пути к классам компиляции.
Gradle
Gradle использует избежание компиляции, чтобы пропускать обработку аннотаций при повторной сборке проекта и ускорять инкрементальные сборки с kapt. В частности, обработка аннотаций пропускается, если:
Исходные файлы проекта не изменились.
Изменения в зависимостях совместимы с ABI. Например, изменились только тела функций.
Однако избежать компиляции нельзя для процессоров аннотаций, обнаруженных в пути к классам компиляции: изменения их внутренней реализации требуют запуска задач обработки аннотаций, даже если ABI процессоров не изменился.
Поэтому мы не рекомендуем использовать процессоры аннотаций из пути к классам компиляции. Чтобы исключить эти процессоры из обработки kapt, добавьте свойство kapt.include.compile.classpath в файл gradle.properties:
# gradle.properties kapt.include.compile.classpath=false
Если для параметра задано значение false, зависимости процессоров аннотаций, не включенные в путь к классам процессоров (конфигурации kapt*), исключаются из обработки kapt.
Maven
Чтобы исключить процессоры аннотаций, не включенные в путь к классам процессоров kapt, задайте для параметра includeCompileClasspath значение false в разделе <execution> плагина kapt:
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<includeCompileClasspath>false</includeCompileClasspath>
<sourceDirs>...</sourceDirs>
<annotationProcessorPaths>...</annotationProcessorPaths>
</configuration>
</execution>
Кроме того, можно использовать свойство kapt.include.compile.classpath в разделе <properties> файла pom.xml:
<properties>
<kapt.include.compile.classpath>false</kapt.include.compile.classpath>
</properties>
Если для параметра задано значение false, процессоры аннотаций, не включенные в раздел <annotationProcessorPaths>, исключаются из обработки kapt.
Если параметр includeCompileClasspath не задан и kapt обнаружит процессор аннотаций в пути к классам компиляции, который явно не указан в пути к классам процессоров, появится предупреждение об устаревании:
[WARNING] Annotation processors discovery from compile classpath is deprecated. Set 'kapt.include.compile.classpath=false' to disable discovery.
Наследование процессоров аннотаций из суперкoнфигураций
Можно определить общий набор процессоров аннотаций в отдельной конфигурации Gradle в качестве суперкoнфигурации, а затем расширить ее в конфигурациях kapt для подпроектов.
Например, для подпроекта, использующего MapStruct, добавьте следующую конфигурацию в файл build.gradle(.kts):
val commonAnnotationProcessors by configurations.creating
configurations.named("kapt") { extendsFrom(commonAnnotationProcessors) }
dependencies {
implementation("org.mapstruct:mapstruct:1.6.3")
commonAnnotationProcessors("org.mapstruct:mapstruct-processor:1.6.3")
}
В этом примере конфигурация Gradle commonAnnotationProcessors — общая суперкoнфигурация для обработки аннотаций, которую нужно использовать во всех проектах. С помощью метода extendsFrom() конфигурация commonAnnotationProcessors добавляется в качестве суперкoнфигурации. kapt видит, что конфигурация Gradle commonAnnotationProcessors зависит от процессора аннотаций MapStruct. Поэтому kapt включает процессор аннотаций MapStruct в конфигурацию обработки аннотаций.
Сохранение процессоров аннотаций компилятора Java
По умолчанию kapt запускает все процессоры аннотаций и отключает обработку аннотаций в javac. Однако для запуска некоторых процессоров аннотаций, например Lombok, может потребоваться javac.
В файле сборки Gradle используйте параметр keepJavacAnnotationProcessors:
kapt {
keepJavacAnnotationProcessors = true
}
Если вы используете Maven, настройте плагин явно. См. пример настройки плагина компилятора Lombok.
Оптимизация сборок kapt
kapt предлагает несколько стратегий для Gradle, позволяющих сократить время обработки аннотаций, в том числе параллельное выполнение задач, использование кэша сборки, кэширование загрузчиков классов процессоров и инкрементальную обработку аннотаций.
Дополнительные параметры, влияющие на поведение сборки, например коррекция типов ошибок, удаление метаданных заглушек и сканирование пути к классам компиляции, см. в разделе Параметры поведения.
Параллельный запуск задач kapt
kapt использует Worker API Gradle для выполнения задач обработки аннотаций. Worker API позволяет Gradle параллельно выполнять независимые задачи обработки аннотаций в рамках одного проекта, что в некоторых случаях значительно сокращает время выполнения.
Если в плагине Kotlin Gradle задана пользовательская версия JDK, рабочие процессы задач kapt используют только режим processIsolation().
Если нужно указать дополнительные аргументы JVM для рабочего процесса kapt, используйте входной параметр kaptProcessJvmArgs задачи KaptWithoutKotlincTask:
tasks.withType<org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask>()
.configureEach {
kaptProcessJvmArgs.add("-Xmx512m")
}
tasks.withType(org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask.class)
.configureEach {
kaptProcessJvmArgs.add('-Xmx512m')
}
Безопасное использование кэша сборки Gradle
Gradle по умолчанию кэширует задачи обработки аннотаций kapt. Однако процессоры аннотаций могут выполнять произвольный код. Это может привести к ненужному преобразованию входных данных задачи в выходные или к доступу к файлам, которые Gradle не отслеживает, и их изменению.
Если процессоры аннотаций, используемые при сборке, нельзя корректно кэшировать, кэширование можно отключить, чтобы избежать ложных срабатываний при проверке кэша задач kapt. Для этого используйте свойство useBuildCache в сценарии сборки:
kapt {
useBuildCache = false
}
Кэширование загрузчиков классов процессоров аннотаций
Кэширование загрузчиков классов процессоров аннотаций помогает ускорить работу kapt, если вы запускаете несколько задач Gradle подряд.
Чтобы включить эту функцию, используйте следующие свойства в файле gradle.properties:
# gradle.properties # # Any positive value enables caching # Use the same value as the number of modules that use kapt kapt.classloaders.cache.size=5 # Disable for caching to work kapt.include.compile.classpath=false
Если при кэшировании процессоров аннотаций возникнут проблемы, отключите их кэширование:
# Specify annotation processors' full names to disable caching for them kapt.classloaders.cache.disableForProcessors=[annotation processors full names]
Использование инкрементальной обработки аннотаций
В Gradle kapt по умолчанию поддерживает инкрементальную обработку аннотаций, поэтому повторно обрабатываются только измененные файлы.
В настоящее время инкрементальная обработка аннотаций работает только в том случае, если:
Инкрементальная компиляция включена.
Все процессоры аннотаций в сборке являются инкрементальными.
Чтобы отключить инкрементальную обработку аннотаций, добавьте эту строку в файл gradle.properties:
kapt.incremental.apt=false
Анализ производительности
kapt предоставляет встроенные средства диагностики, помогающие оценить производительность обработки аннотаций. Среди них — отчеты о времени выполнения каждого процессора и количестве созданных файлов, позволяющие выявлять неиспользуемые процессоры.
Дополнительные параметры диагностики, например история чтения файлов для отладки инкрементальной обработки и обнаружение утечек памяти, см. в разделе Параметры диагностики и статистики.
Измерение производительности процессоров аннотаций
Чтобы получить статистику производительности выполнения процессоров аннотаций, используйте параметр showProcessorStats. Пример вывода:
Kapt Annotation Processing performance report: com.example.processor.TestingProcessor: total: 133 ms, init: 36 ms, 2 round(s): 97 ms, 0 ms com.example.processor.AnotherProcessor: total: 100 ms, init: 6 ms, 1 round(s): 93 ms
Этот отчет можно сохранить в файл с помощью параметра dumpProcessorStats. Например, следующая команда CLI запускает kapt и сохраняет статистику в файл ap-perf-report.file:
kapt -Kapt-mode=stubsAndApt \ -Kapt-classpath=processor/build/libs/processor.jar \ -Kapt-dump-processor-stats=ap-perf-report.file \ sample/src/main/
Отслеживание количества созданных файлов
Плагин kapt может выводить статистику о количестве файлов, созданных каждым процессором аннотаций.
Это помогает определить, включены ли в сборку неиспользуемые процессоры аннотаций. По созданному отчету можно найти модули, запускающие ненужные процессоры аннотаций, и обновить их, чтобы избежать этого.
Чтобы включить вывод статистики:
-
В файле сборки Gradle задайте для параметра
showProcessorStatsзначениеtrue:// build.gradle(.kts) kapt { showProcessorStats = true } -
В файле
gradle.propertiesзадайте для параметра компилятораverboseзначениеtrue:# gradle.properties kapt.verbose=true
Статистика отображается в журналах с уровнем info. Сначала выводится строка Annotation processor stats:, за которой следует статистика времени выполнения каждого процессора аннотаций. Затем выводится строка Generated files report:, за которой следует статистика количества файлов, созданных каждым процессором аннотаций. Например:
[INFO] Annotation processor stats: [INFO] org.mapstruct.ap.MappingProcessor: total: 290 ms, init: 1 ms, 3 round(s): 289 ms, 0 ms, 0 ms [INFO] Generated files report: [INFO] org.mapstruct.ap.MappingProcessor: total sources: 2, sources per round: 2, 0, 0
Создание исходного кода Kotlin
kapt может создавать исходный код Kotlin. Для этого записывайте созданные файлы исходного кода Kotlin в указанный каталог с помощью processingEnv.options["kapt.kotlin.generated"]. Затем файлы исходного кода Kotlin компилируются вместе с основными исходными файлами.
Параметры компилятора
Настройка процессора аннотаций
Параметр |
Описание |
Настройка |
|---|---|---|
|
Управляет выполнением этапов рабочего процесса kapt:
|
Gradle: напрямую недоступно; Gradle запускает генерацию заглушек и apt как отдельные задачи Maven:
<aptMode>stubsAndApt</aptMode>
CLI: |
|
Элементы classpath, в которых выполняется поиск процессоров аннотаций. |
Gradle:
dependencies {
kapt("com.example:processor:1.0")
}
Maven:
<annotationProcessorPaths>
<annotationProcessorPath>...</annotationProcessorPath>
</annotationProcessorPaths>
CLI: |
|
Разделённые запятыми полные имена классов процессоров, которые нужно запустить, минуя поиск. |
Gradle:
kapt {
annotationProcessor("com.example.MyProcessor")
}
Maven:
<annotationProcessors>
<annotationProcessor>com.example.MyProcessor</annotationProcessor>
</annotationProcessors>
CLI: |
|
Параметры в формате «ключ — значение», передаваемые процессорам аннотаций. |
Gradle:
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
Maven:
<annotationProcessorArgs>
<annotationProcessorArg>room.schemaLocation=/schemas</annotationProcessorArg>
</annotationProcessorArgs>
CLI: |
|
Параметры в формате «ключ — значение», передаваемые компилятору Java. |
Gradle:
kapt {
javacOptions {
option("-source", "11")
}
}
Maven:
<javacOptions>
<javacOption>-source=11</javacOption>
</javacOptions>
CLI: |
|
Включает инкрементальную обработку аннотаций: повторно обрабатываются только файлы, затронутые изменениями. |
Gradle:
# gradle.properties
kapt.incremental.apt=true
Maven: в настоящее время не поддерживается CLI: в настоящее время не поддерживается |
Параметры выходных каталогов
Параметр |
Описание |
Настройка |
|---|---|---|
|
Каталог, в котором процессоры аннотаций создают исходные файлы |
Gradle: автоматически устанавливается в Maven: автоматически устанавливается в CLI: |
|
Каталог для файлов |
Gradle: управляется автоматически Maven: управляется автоматически CLI: |
|
Каталог для файлов-заглушек Java, сгенерированных из исходных файлов Kotlin и используемых как входные данные для процессоров аннотаций. |
Gradle: управляется автоматически Maven: управляется автоматически CLI: |
|
Хранит состояние для инкрементальных сборок. |
Gradle: управляется автоматически Maven: в настоящее время не поддерживается CLI: в настоящее время не поддерживается |
Параметры поведения
Параметр |
Описание |
Настройка |
|---|---|---|
|
По умолчанию kapt заменяет каждый неизвестный тип (включая типы для сгенерированных классов) на
|
Gradle:
kapt {
correctErrorTypes = true
}
Maven:
<correctErrorTypes>true</correctErrorTypes>
CLI: |
|
Добавляет инициализаторы параметров по умолчанию в качестве значений полей в сгенерированные заглушки.
|
Gradle:
kapt {
dumpDefaultParameterValues = true
}
Maven: недоступно CLI: |
|
Сопоставляет сообщения об ошибках из файлов-заглушек с исходными позициями в коде Kotlin.
|
Gradle:
kapt {
mapDiagnosticLocations = true
}
Maven:
<mapDiagnosticLocations>true</mapDiagnosticLocations>
CLI: |
|
Преобразует несовместимости при генерации заглушек в ошибки вместо предупреждений.
|
Gradle:
kapt {
strictMode = true
}
Maven: недоступно CLI: |
|
Удаляет аннотации
|
Gradle:
kapt {
stripMetadata = true
}
Maven: недоступно CLI: |
|
Включает подробное ведение журнала kapt.
|
Gradle:
# gradle.properties
kapt.verbose=true
Maven: в настоящее время не поддерживается CLI: в настоящее время не поддерживается |
|
Повышает уровень информационных сообщений kapt до предупреждений.
|
Gradle: напрямую недоступно Maven: в настоящее время не поддерживается CLI: в настоящее время не поддерживается |
|
Выполняет поиск процессоров аннотаций в classpath компиляции. Для воспроизводимости задайте значение
|
Gradle:
kapt {
includeCompileClasspath = false
}
Maven:
<includeCompileClasspath>false</includeCompileClasspath>
CLI: в настоящее время не поддерживается |
Параметры диагностики и статистики
Параметр |
Описание |
Настройка |
|---|---|---|
|
Выводит время выполнения для каждого процессора в stdout. |
Gradle:
kapt {
showProcessorStats = true
}
Maven: недоступно CLI: |
|
Записывает статистику времени работы процессоров в файл. |
Gradle: недоступно Maven: недоступно CLI: |
|
Записывает в файл список файлов, прочитанных процессорами; это полезно для отладки инкрементальной обработки аннотаций. |
Gradle: недоступно Maven: недоступно CLI: |
|
Режим обнаружения утечек памяти: |
Gradle:
kapt {
detectMemoryLeaks = "paranoid"
}
Maven: в настоящее время не поддерживается CLI: в настоящее время не поддерживается |
Что дальше
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/kapt.html