如何在命令行中使用kapt(与kotlinc一起)?

7

官方文档介绍了如何在Gradle和Maven中使用kapt。但是我该如何在命令行中使用kotlinc来使用kapt呢?


2
如果你找不到相关信息,可以尝试使用--debug日志级别运行Gradle构建,并查找类似[KOTLIN] Kotlin compiler args: ...的行。找到与kapt相关的那一行,而不是常规的Kotlin编译,它将包含所需的命令行参数。 - hotkey
@hotkey 看起来是个不错的主意。 - holi-java
@hotkey 是的,那是我的方法 =) - cubuspl42
1个回答

9

tools.jar 添加到 Kotlin 编译器的类路径中

从 Kotlin 版本 1.1.3-2 开始,kotlinc 不会将 tools.jar 添加到编译器的类路径中。而 kapt 需要使用 tools.jar

可以通过修补 kotlinc 的方式来解决该问题。

vim $KOTLIN_HOME/bin/kotlinc

请编辑第79行。

起始内容:

kotlin_app=("${KOTLIN_HOME}/lib/kotlin-preloader.jar" "org.jetbrains.kotlin.preloading.Preloader" "-cp" "${KOTLIN_HOME}/lib/kotlin-compiler.jar" $KOTLIN_COMPILER)

致:

kotlin_app=("${KOTLIN_HOME}/lib/kotlin-preloader.jar" "org.jetbrains.kotlin.preloading.Preloader" "-cp" "${KOTLIN_HOME}/lib/kotlin-compiler.jar:$JAVA_HOME/lib/tools.jar" $KOTLIN_COMPILER)

注意: $JAVA_HOME 必须指向JDK,而不是JRE。

注意: 这是一个hack。

使用正确的参数调用 kotlinc

kotlinc -cp $MY_CLASSPATH \
-Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar -P \
plugin:org.jetbrains.kotlin.kapt3:aptMode=aptAndStubs,\
plugin:org.jetbrains.kotlin.kapt3:apclasspath=/path/to/SomeAnnotationProcessor.jar,\
plugin:org.jetbrains.kotlin.kapt3:sources=./sources,\
plugin:org.jetbrains.kotlin.kapt3:classes=./classes,\
plugin:org.jetbrains.kotlin.kapt3:stubs=./stubs \
/path/to/MyKotlinFile.kt

替换:

  • $MY_CLASSPATH替换为您想要的类路径
  • /path/to/SomeAnnotationProcessor.jar替换为实际某个注释处理器的路径
  • ./sources./classes./stubs替换为分别存储中间构件的目录路径
  • /path/to/MyKotlinFile.kt替换为要编译的Kotlin文件的路径
  • (可选) 将$KOTLIN_HOME替换为Kotlin安装目录的路径(您应该已经在环境变量中设置了此路径)

注意: -X参数(高级选项)是非标准的,可能会在没有任何通知的情况下更改或删除

注意: kapt的接口未记录。您可以检查源代码: https://github.com/JetBrains/kotlin/blob/master/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt#L295


这些内容是从在kotlin-examples/gradle/kotlin-dagger中运行gradle build --debug反向工程得到的(https://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-dagger)。

这只是一个起点。我仍然不确定一些事情。请随意编辑此答案。

感谢runningcode: https://github.com/facebook/buck/issues/956#issuecomment-309080611

如果不明显: 这些东西很糟糕。JetBrains假定CLI无关紧要,他们将关键接口未记录/保留为内部使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接