如何从命令行使用kapt(使用kotlinc)?

时间:2017-07-20 14:19:03

标签: java shell kotlin kapt kotlinc

Official documentation指示如何使用Gradle和Maven中的kapt。但是如何使用kapt命令行中的kotlinc

1 个答案:

答案 0 :(得分:6)

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安装目录的路径(您的env中已经有此内容)

注意:-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-dagger中运行runningcode进行逆向设计的。

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

感谢<textarea>https://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-dagger

如果不是很明显:这个东西很糟糕。 JetBrains只是假设CLI并不重要,他们使关键接口没有记录/保留供内部使用。