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

Posted

技术标签:

【中文标题】如何从命令行(使用 kotlinc)使用 kapt?【英文标题】:How to use kapt from command line (with kotlinc)? 【发布时间】:2017-12-26 07:25:43 【问题描述】:

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

【问题讨论】:

如果您对此一无所知,您可以尝试使用 --debug 日志级别运行 Gradle 构建并找到类似于 [KOTLIN] Kotlin compiler args: ... 的行。找到与 kapt 相关的,而不是常规的 Kotlin 编译,它将包含所需的命令行参数。 @hotkey 这似乎是个好主意。 @hotkey 是的,那是我的方法 =) 【参考方案1】:

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

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

作为一种解决方法,您可以修补 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 (https://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-dagger) 中运行 gradle build --debug 进行逆向工程的。

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

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

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

【讨论】:

以上是关于如何从命令行(使用 kotlinc)使用 kapt?的主要内容,如果未能解决你的问题,请参考以下文章

在 UBUNTU 中从 VS Code 运行 Kotlin 会产生 kotlinc:未找到

使用 kapt 和 gradle 时无法调试注释处理器

windows手动搭建Kotlin命令行环境

如何更改 kapt 插件生成输出目录路径?

maven 支持 kapt 吗?

Kapt 注释处理 - 如何显示完整的堆栈跟踪