译注:kapt 即 Kotlin annotation processing tool(Kotlin 注解处理工具)缩写。
在 Kotlin 中通过 kapt 编译器插件支持注解处理器(参见JSR 269)。
简而言之,你可以在 Kotlin 项目中使用像 Dagger 或者 Data Binding 这样的库。
关于如何将 kapt 插件应用于 Gradle/Maven 构建中,请阅读下文。
应用 kotlin-kapt Gradle 插件:
kotlin-kapt
apply plugin: 'kotlin-kapt'
或者,你可以使用插件 DSL 应用它:
plugins { id "org.jetbrains.kotlin.kapt" version "1.3.11" }
然后在 dependencies 块中使用 kapt 配置添加相应的依赖项:
dependencies
kapt
dependencies { kapt 'groupId:artifactId:版本' }
如果你以前使用 Android 支持作为注解处理器,那么以 kapt 取代 annotationProcessor 配置的使用。如果你的项目包含 Java 类,kapt 也会顾全到它们。
annotationProcessor
如果为 androidTest 或 test 源代码使用注解处理器,那么相应的 kapt 配置名为 kaptAndroidTest 和 kaptTest。请注意 kaptAndroidTest 和 kaptTest 扩展了 kapt,所以你可以只提供 kapt 依赖而它对生产和测试源代码都可用。
androidTest
test
kaptAndroidTest
kaptTest
使用 arguments {} 块将参数传给注解处理器:
arguments {}
kapt { arguments { arg("key", "value") } }
Kapt 使用 Java 编译器来运行注解处理器。 以下是将任意选项传给 javac 的方式:
kapt { javacOptions { // 增加注解处理器的最大错误次数 // 默认为 100。 option("-Xmaxerrs", 500) } }
一些注解处理器(如 AutoFactory)依赖于声明签名中的精确类型。默认情况下,Kapt 将每个未知类型(包括生成的类的类型)替换为 NonExistentClass,但你可以更改此行为。将额外标志添加到 build.gradle 文件以启用在存根(stub)中推断出的错误类型:
AutoFactory
NonExistentClass
build.gradle
kapt { correctErrorTypes = true }
在 compile 之前在 kotlin-maven-plugin 中添加 kapt 目标的执行:
compile
<execution> <id>kapt</id> <goals> <goal>kapt</goal> </goals> <configuration> <sourceDirs> <sourceDir>src/main/kotlin</sourceDir> <sourceDir>src/main/java</sourceDir> </sourceDirs> <annotationProcessorPaths> <!-- 在此处指定你的注解处理器。 --> <annotationProcessorPath> <groupId>com.google.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>2.9</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </execution>
你可以在 Kotlin 示例版本库 中找到一个显示使用 Kotlin、Maven 和 Dagger 的完整示例项目。
请注意,IntelliJ IDEA 自身的构建系统目前还不支持 kapt。当你想要重新运行注解处理时,请从“Maven Projects”工具栏启动构建。
Kapt 编译器插件已随 Kotlin 编译器的二进制发行版分发。
可以使用 kotlinc 选项 Xplugin 提供该 JAR 文件的路径来附加该插件:
Xplugin
-Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar
以下是可用选项的列表:
sources
classes
stubs
incrementalData
apclasspath
apoptions
javacArguments
processors
verbose
aptMode
apt
stubsAndApt
correctErrorTypes
插件选项格式为:-P plugin:<plugin id>:<key>=<value>。选项可以重复。
-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
Kapt 可生成 Kotlin 代码。是将生成的 Kotlin 源文件写入processingEnv.options["kapt.kotlin.generated"] 所指定的目录,这些文件会与主源代码一起编译。
processingEnv.options["kapt.kotlin.generated"]
可以在 kotlin-examples Github 版本库中找到完整的示例。
请注意,对于所生成 Kotlin 文件,Kapt 不支持多轮处理。
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()) }
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8