Spec-Zone.ru › Kotlin 1.6

Использование kapt

kapt находится в режиме технического обслуживания. Мы поддерживаем его актуальность с недавними выпусками Kotlin и Java, но не планируем добавлять новые функции. Пожалуйста, используйте Kotlin Symbol Processing API (KSP) для обработки аннотаций. См. список библиотек, поддерживаемых KSP.

Обработчики аннотаций (см. JSR 269) поддерживаются в Kotlin с помощью плагина компилятора kapt.

Короче говоря, вы можете использовать такие библиотеки, как Dagger или Data Binding в своих проектах на Kotlin.

Ниже подробно описано, как применять плагин kapt к вашей сборке Gradle/Maven.

Использование в Gradle

Примените плагин Gradle kotlin-kapt:

plugins {
    kotlin("kapt") version "1.6.20"
}
plugins {
    id "org.jetbrains.kotlin.kapt" version "1.6.20"
}

В качестве альтернативы вы можете использовать синтаксис apply plugin:

apply plugin: 'kotlin-kapt'

Затем добавьте соответствующие зависимости, используя конфигурацию 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 и она будет доступна как для производственных источников, так и для тестов.

Аргументы обработчика аннотаций

Используйте блок arguments {} для передачи аргументов обработчикам аннотаций:

kapt {
    arguments {
        arg("key", "value")
    }
}

Поддержка кеша Gradle сборки

Задачи обработки аннотаций kapt по умолчанию кэшируются в Gradle. Однако обработчики аннотаций выполняют произвольный код, который может не преобразовывать входы задачи в выходы, может получать доступ к файлам и изменять их, не отслеживаемые Gradle, и т. д. Если обработчики аннотаций, используемые в сборке, не могут быть должным образом кэшированы, можно полностью отключить кэширование для kapt, добавив следующие строки в скрипт сборки, чтобы избежать ложноположительных попаданий в кэш для задач kapt:

kapt {
    useBuildCache = false
}

Улучшение скорости сборок, использующих kapt

Параллельное выполнение задач kapt

Для повышения скорости сборок, использующих kapt, можно включить Gradle Worker API для задач kapt. Использование API Worker позволяет Gradle запускать независимые задачи обработки аннотаций из одного проекта параллельно, что в некоторых случаях значительно уменьшает время выполнения.

При использовании функции пользовательской домашней директории JDK в плагине Kotlin Gradle, рабочие задачи kapt используют только режим изоляции процесса . Обратите внимание, что свойство kapt.workers.isolation игнорируется.

Если вы хотите предоставить дополнительные аргументы JVM для процесса kapt worker, используйте вход 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')
    }

Кэширование загрузчиков классов обработчиков аннотаций

Кэширование загрузчиков классов обработчиков аннотаций в kapt находится в стадии эксперимента. Оно может быть удалено или изменено в любое время. Используйте его только в оценочных целях. Мы будем рады получить ваши отзывы об этом на YouTrack.

Кэширование загрузчиков классов обработчиков аннотаций помогает kapt работать быстрее, если вы выполняете много задач Gradle последовательно.

Для включения этой функции используйте следующие свойства в вашем файле gradle.properties:

# positive value will enable 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]

Избегание компиляции для kapt

Для повышения времени выполнения инкрементных сборок с kapt, она может использовать Gradle избегание компиляции. При включенном избегании компиляции Gradle может пропустить обработку аннотаций при пересборке проекта. В частности, обработка аннотаций пропускается, когда:

  • Исходные файлы проекта не изменены.

  • Изменения в зависимостях совместимы по ABI. Например, единственные изменения в телах методов.

Однако, избегание компиляции не может быть использовано для обработчиков аннотаций, обнаруженных в классе компиляции, так как любые изменения в них требуют запуска задач обработки аннотаций.

Чтобы запустить kapt с избеганием компиляции:

  • Добавьте зависимости обработчиков аннотаций в конфигурации kapt* вручную, как описано выше.

  • Отключите обнаружение обработчиков аннотаций в классе компиляции, добавив эту строку в ваш файл gradle.properties:

kapt.include.compile.classpath=false

Инкрементная обработка аннотаций

kapt поддерживает инкрементную обработку аннотаций, которая включена по умолчанию. В настоящее время инкрементная обработка аннотаций возможна только если все используемые обработчики аннотаций являются инкрементными.

Чтобы отключить инкрементную обработку аннотаций, добавьте эту строку в свой файл gradle.properties:

kapt.incremental.apt=false

Обратите внимание, что инкрементная обработка аннотаций требует, чтобы инкрементная компиляция также была включена.

Параметры компилятора 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-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>com.google.dagger</groupId>
                <artifactId>dagger-compiler</artifactId>
                <version>2.9</version>
            </annotationProcessorPath>
        </annotationProcessorPaths>
    </configuration>
</execution>

Обратите внимание, что kapt все еще не поддерживается собственной системой сборки IntelliJ IDEA. Запускайте сборку из панели инструментов «Maven Projects», когда вам нужно повторно выполнить обработку аннотаций.

END_OF_DOCUMENT_MARKER

Использование в командной строке

Плагин компилятора 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: Список параметров, передаваемых в javac, в кодировке base64. Для получения дополнительной информации см. кодировку параметров 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"], и эти файлы будут скомпилированы вместе с основными источниками.

Обратите внимание, что 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())
}

Сохранение обработчиков аннотаций Java-компилятора

По умолчанию kapt запускает все обработчики аннотаций и отключает обработку аннотаций javac. Однако вам может потребоваться работа некоторых обработчиков аннотаций javac (например, Lombok).

В файле сборки Gradle используйте параметр keepJavacAnnotationProcessors:

kapt {
    keepJavacAnnotationProcessors = true
}

Если вы используете Maven, вам необходимо указать конкретные настройки плагина. Посмотрите этот пример настроек плагина компилятора Lombok.

Последнее изменение: 07 апреля 2022 г.
Плагин компилятора SAM-с-приемником Плагин компилятора Lombok

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/kapt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API