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