7

官方文档指导如何kapt从 Gradle 和 Maven 使用。但是我如何kapt从命令行使用kotlinc呢?

4

1 回答 1

9

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

从 Kotlin 版本 1.1.3-2 开始,kotlinc不添加tools.jar到编译器的类路径中。tools.jar是必需的kapt

作为一种解决方法,您可以修补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。

注意:这是一个黑客。

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


gradle build --debug这些东西是从运行中逆向工程的kotlin-examples/gradle/kotlin-daggerhttps://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-dagger)。

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

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

如果不是很明显:这东西很烂。JetBrains 只是假设 CLI 无关紧要,他们使关键接口未记录/保留供内部使用。

于 2017-07-20T14:52:40.857 回答