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

时间:2016-01-16 16:58:15

标签: kotlin vert.x

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

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

在问题中,您的语言支持链接在路径“vertx.io/vertx2/language_support.html”中说Vert.x 2;这与现在在Vert.x中完成的方式不同。我认为你将两个想法合二为一。首先,Vert.x 3希望你从源代码运行Java / Kotlin文件(它实际上并不是;这是Vert.x的一件事,他们已经从编译语言中删除了),其次是您需要自定义语言支持(您不)。

您应该尝试通过运行已编译的代码来使用Vert.x 3. 为此,请构建您的类并运行自己的main() deploys a verticle programatically。您的代码很简单:

import io.vertx.core.Vertx

fun main(args: Array<String>) {
    val vertx = Vertx.vertx()
    vertx.deployVerticle(SomeVerticleOfMine())
}

或者,docs for running and deploying from the command-line说:

  

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

实际上它确实只适用于原型设计和快速测试,而且它并不比让你的IDE做同样的事情并从编译的类运行更快。然后,您还可以使用IDE的调试功能,这些功能具有无限的价值。

对于使用Kotlin和Vert.x 的一些辅助库,请查看以下选项:

有一个full sample project of running Vert.x + Kovert (特别是以App class开头)。您可以查看Kovert的代码来完成您自己的类似工作,使用Promises或者您希望的方式很好地启动和运行Vert.x. Kovert的文档包含starting Vertxstarting a Verticle to use Vert.x-Web代码的链接,因此您可以阅读更多示例代码。但它有助于理解Injekt(轻量级依赖注册表),Kovenant(承诺库)和Klutter configuration injection来理解完整的样本。

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

答案 2 :(得分:2)

Kotlin 1.1附带javax.script (JSR-223)支持,这意味着您可以将其用作脚本引擎,类似于使用Nashorn的JavaScript。