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

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

这感觉就像一个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()) } 

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

运行Vert.x之前,Vert.x将立即编译Java源文件。 这对快速构建Verticle原型非常有用,而且对于演示非常有用。 不需要先建立一个Maven或Gradle构建来开始吧!

实际上它只是用于原型设计和快速测试,而不是让IDE执行相同的操作并从编译的类中运行。 然后您也可以调试IDE的调试功能,这些功能是无限的。

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

  • Klutter的Vert.x 3模块 – 我是作者,我的一个库
  • 用于Kotlin的Vert.x 3助手 – 由Cy6erGn0m提供
  • Kovert,Vert.x 3的REST框架 – 我是作者,我的一个库
  • Vert.x nubes – 不是Kotlin特有的,但是使得JVM语言的Vert.x-Web更加友好。

有一个运行Vert.x + Kovert的完整示例项目 (专门从App类开始)。 你可以看看Kovert的代码,做你自己的类似的工作,很好地启动和运行Vert.x,用Promises或者你希望的。 Kovert的文档链接到启动Vertx的代码,并启动一个Verticle来使用Vert.x-Web ,所以可以读取更多示例代码。 但它有助于理解Injekt (轻量级依赖注册表), Kovenant (promises库)和Klutter配置注入来了解完整的示例。

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

是的,这是可能的。 你可以查看一下Kotlin codegen测试代码的例子。 (请注意,这不是Kotlin稳定API的一部分,而且往往会频繁更改。)

Kotlin 1.1自带有javax.script(JSR-223)支持,这意味着您可以像使用Nashorn一样将JavaScript用作脚本引擎。