如何在运行时编译和使用Kotlin代码?

Jus*_*bie 7 kotlin vert.x

我正在尝试创建一个Kotlin Vert.x语言支持模块,我需要一种方法来编译Kotlin文件并加载结果ClassLoader.我已经尝试使用kotlin-compiler库并找到了K2JVMCompiler类,但它似乎只支持命令行样式的参数及其exec方法.有没有办法在运行时编译Kotlin文件(可能无需保存和读取.class文件)并立即加载生成的类?(有点像Groovy那样.)如果没有,你有任何有用的编译器参数建议或几乎任何建议吗?

yol*_*ole 8

是的,这是可能的.您可以查看Kotlin codegen测试 以获取执行此操作的代码示例.(请注意,这不是Kotlin稳定API的一部分,并且往往会经常发生变化.)


Jay*_*ard 2

这感觉就像一个XY 问题。您想知道如何动态编译 Kotlin,以便通过从 Kotlin 源文件而不是编译代码运行来更轻松地使用 Vert.x。但实际上 Vert.x 使用的推荐路径是创建一段简单的代码,在编译的代码中部署 Verticle。

在这个问题中,您的语言支持链接在路径“vertx.io/vertx2/language_support.html”中显示Vert.x 2;这与现在 Vert.x 3 中的做法不同。我认为您正在将两种想法合并为一种。首先,Vert.x 3 希望您从源代码运行 Java/Kotlin 文件(实际上并非如此;这是 Vert.x 2 中他们从编译语言中删除的东西),其次您需要自定义语言支持(您不)。

您应该尝试通过运行编译的代码来使用 Vert.x 3。 为此,请构建您的类并运行您自己的类main()以编程方式部署 Verticle。您的代码很简单:

import io.vertx.core.Vertx

fun main(args: Array<String>) {
    val vertx = Vertx.vertx()
    vertx.deployVerticle(SomeVerticleOfMine())
}
Run Code Online (Sandbox Code Playgroud)

或者,从命令行运行和部署的文档说:

Vert.x 将在运行之前动态编译 Java 源文件。这对于快速制作 verticle 原型非常有用,并且非常适合演示。无需先设置 Maven 或 Gradle 构建即可开始!

实际上,它确实只是用于原型设计和快速测试,并且它并不比让您的 IDE 执行相同操作并从已编译的类运行更快。然后,您还可以使用 IDE 的调试功能,这是非常有价值的。

有关将 Kotlin 与 Vert.x 结合使用的一些帮助程序库,请查看以下选项:

有一个运行 Vert.x + Kovert 的完整示例项目(具体从App 类开始)。您可以查看 Kovert 的代码来完成您自己的类似工作,使用 Promises 或您希望的方式很好地启动和运行 Vert.x。Kovert 的文档包含用于启动 Vertx以及启动 Verticle 以使用 Vert.x-Web 的代码链接,因此您可以阅读更多示例代码。但它有助于理解Injekt(轻量级依赖项注册表)、Kovenant(承诺库)和Klutter 配置注入以理解完整的示例。

其他快速说明,Vert.x 对其他语言有 codegen 支持,但由于您可以直接调用所有 Java 版本,因此它也不需要支持 Kotlin。