官方文档介绍了如何在Gradle和Maven中使用kapt
。但是我该如何在命令行中使用kotlinc
来使用kapt
呢?
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无关紧要,他们将关键接口未记录/保留为内部使用。
--debug
日志级别运行Gradle构建,并查找类似[KOTLIN] Kotlin compiler args: ...
的行。找到与kapt相关的那一行,而不是常规的Kotlin编译,它将包含所需的命令行参数。 - hotkey