Обработка аннотаций с Kotlin
Обработчики аннотаций (см. JSR 269) поддерживаются в Kotlin с помощью плагина компилятора kapt.
Если коротко, то в проектах Kotlin можно использовать такие библиотеки, как Dagger или Data Binding .
Ниже демонстрируется применение плагина kapt к сборкам Gradle/Maven.
Использование в Gradle
Применим плагин kotlin-kapt в Gradle:
apply plugin: 'kotlin-kapt'
Или с помощью плагинов предметно-ориентированного языка:
plugins {
id "org.jetbrains.kotlin.kapt" version "{{ site.data.releases.latest.version }}"
}
Затем добавим соответствующие зависимости, используя конфигурацию kapt в нашем блоке dependencies:
dependencies {
kapt 'groupId:artifactId:version'
}
Если для обработчиков аннотаций ранее использовался Android support, то необходимо заменить annotationProcessor на kapt. Если наш проект содержит классы Java, kapt также позаботится и о них.
Если обработчики аннотаций использовались для исходного кода androidTest или test, конфигурации kapt будут называться соответственно kaptAndroidTest и kaptTest. Обратите внимание на то, что kaptAndroidTest и kaptTest расширяют kapt, поэтому достаточно предоставить только зависимость kapt, и она будет доступна как для исходного кода, так и для тестов.
Аргументы обработчика аннотации
Используем блок arguments {} для передачи аргументов обработчикам аннотаций:
kapt {
arguments {
arg("key", "value")
}
}
Параметры компилятора Java
Kapt использует компилятор Java для запуска обработчиков аннотаций. Так можно передавать произвольные параметры в javac:
kapt {
javacOptions {
// Increase the max count of errors from annotation processors.
// Default is 100.
option("-Xmaxerrs", 500)
}
}
Коррекция несуществующего типа
Некоторые обработчики аннотаций (например, AutoFactory) полагаются на известные типы в объявлениях сигнатур. По умолчанию Kapt заменяет каждый неизвестный тип (включая типы для сгенерированных классов) на NonExistentClass, но это поведение можно изменить. Добавим в build.gradle дополнительный флаг для включения данного типа ошибки в заглушки:
kapt {
correctErrorTypes = true
}
Использование в Maven
Добавим выполнение цели kapt от плагина kotlin-maven до 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>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.9</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
Полный образец проекта, показывающий использование Kotlin, Maven и Dagger, можно найти в репозитории примеров Kotlin.
Обратите внимание на то, что kapt по-прежнему не поддерживается собственной системой сборки IntelliJ IDEA. Запустите сборку с панели инструментов Maven Projects, если требуется повторный запуск обработки аннотаций.
Использование в командной строке
Плагин компилятора Kapt доступен в бинарном дистрибутиве компилятора Kotlin.
Плагин можно подключить, указав его путь к JAR-файлу с помощью параметра Xplugin kotlinc:
-Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar
Список доступных параметров:
sources(обязательно): Путь вывода для сгенерированных файлов.classes(обязательно): Путь вывода для сгенерированных файлов и ресурсов.stubs(обязательно): Путь вывода для файлов-заглушек. Другими словами, какая-то временная директория.incrementalData: Путь вывода для бинарных заглушек.apclasspath(повторяется): путь к обработчику JAR для аннотации. Передайте столько вариантовapclasspath, сколько у вас имеется JARов.apoptions: Кодированный в base64 список параметров обработчика аннотаций. Для получения дополнительной информации см. Кодировка параметров AP / javac .javacArguments: Кодированный в base64 список параметров, переданных в javac. Для получения дополнительной информации см. Кодировка параметров AP / javac .processors: Список идущих через запятую имен классов обработчиков аннотаций. Если данный список определен, то kapt не будет пытаться искать обработчики аннотаций вapclasspath.verbose: Включить подробный вывод.aptMode(обязательно)stubs– генерировать только заглушки, необходимые для обработки аннотаций;apt– только обрабатывать аннотации;stubsAndApt– генерировать заглушки и обрабатывать аннотации;
correctErrorTypes: Смотрите здесь. По умолчанию отключено.
Формат параметров плагина: -P plugin:<plugin id>:<key>=<value>. Параметры могут повторяться.
Пример:
-P plugin:org.jetbrains.kotlin.kapt3:sources=build/kapt/sources
-P plugin:org.jetbrains.kotlin.kapt3:classes=build/kapt/classes
-P plugin:org.jetbrains.kotlin.kapt3:stubs=build/kapt/stubs
-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=lib/ap.jar
-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=lib/anotherAp.jar
-P plugin:org.jetbrains.kotlin.kapt3:correctErrorTypes=true
Создание исходного кода Kotlin
Kapt может генерировать исходный код Kotlin. Просто поместим сгенерированные исходные файлы Kotlin в указанную директорию processingEnv.options["kapt.kotlin.generated"], и эти файлы будут скомпилированы вместе с основными исходниками.
Полный образец можно найти в kotlin-examples репозитория Github.
Обратите внимание на то, что Kapt не поддерживает множественные циклы для сгенерированных файлов Kotlin.
Кодировка параметров AP / javac
Параметры интерфейса командной строки apoptions и javacArguments принимают кодированные пары “ключ-значение” параметров.
Так можно кодировать параметры самостоятельно:
fun encodeList(options: Map<String, String>): String {
val os = ByteArrayOutputStream()
val oos = ObjectOutputStream(os)
oos.writeInt(options.size)
for ((key, value) in options.entries) {
oos.writeUTF(key)
oos.writeUTF(value)
}
oos.flush()
return Base64.getEncoder().encodeToString(os.toByteArray())
}