Как скомпилировать и использовать код Kotlin во время выполнения?

Я пытаюсь создать Котлин Vert.x модуль поддержки языка, и мне нужен способ скомпилировать файлы Kotlin и загрузить результаты с помощью ClassLoader. Я пробовал использовать kotlin-compiler библиотеки и нашел K2JVMCompiler класс, но он, похоже, поддерживает только аргументы в стиле командной строки с его exec метод. Есть ли способ скомпилировать файл Kotlin во время выполнения (возможно, без сохранения и чтения .class files) и сразу загрузить сгенерированные классы? (Вроде как в Groovy делает.) Если нет, есть ли у вас какие-либо полезные предложения аргументов компилятора или почти любые советы?

3 ответов


это похоже на проблема по XY. Вы хотите знать, как скомпилировать Kotlin на лету, чтобы вы могли легче использовать Vert.x путем запуска из исходных файлов Kotlin вместо скомпилированного кода. Но на самом деле рекомендуемый путь для Vert.X использование-создать простой бит кода, который развертывает вашу вертикаль в составлен код.

в вопросе ваша ссылка для языковой поддержки говорит Vert.x 2 в пути "vertx.Ио/vertx2/language_support.html"; это отличается от того, как это сейчас сделано в Верт.x 3. Я думаю, вы сливаете две мысли в одну. Сначала этот Верт.x 3 хочет, чтобы вы запускали файлы Java/Kotlin из исходного кода (на самом деле это не так; это был Верт.x 2 вещь, от которой они отошли для скомпилированных языков), а во-вторых, вам нужна поддержка пользовательского языка (не).

вы должны попытаться использовать Vert.x 3 by запуск скомпилированного кода. для этого создайте свои классы и запустите свой собственный main() что развертывает вертикаль программно. Ваш код будет прост:

import io.vertx.core.Vertx

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

кроме того,документы для запуска и развертывания из командной строки говорят:

Vert.x скомпилирует исходный файл Java на лету перед его запуском. Это очень полезно для быстрого прототипирования verticles и демос. Отсутствие потребности настроить a Maven или Gradle строят сначала, чтобы идти!

и на самом деле это действительно просто для прототипирования и быстрого тестирования, и это не быстрее, чем позволить вашей IDE делать то же самое и работать из скомпилированных классов. У вас также есть функции отладки IDE, которые бесконечно ценны.

для нескольких вспомогательных библиотек для использования Kotlin с Vert.x, эти варианты:

есть полный образец проекта запуска Vert.x + Kovert (в частности, начните с the приложение класс). Вы можете посмотреть код Kovert, чтобы сделать свою собственную аналогичную работу по запуску и запуску Vert.x красиво, с обещаниями или как вы хотите. Документы для Kovert имеют ссылки на код для запуск Vertx и запуск вертикали для использования Vert.x-Web, так больше кода образца вы можете прочитать. Но это помогает понять Injekt (легкий реестр зависимостей),Ковенант (библиотека обещаний), и впрыска конфигурации Klutter чтобы понять полный образец.

другое краткое Примечание, Vert.x имеет поддержку codegen для других языков, но так как вы можете вызвать всю версию Java напрямую, ему также не нужно поддерживать Kotlin.


Да, это возможно. Вы можете проверить Котлин codegen тесты пример кода, который делает это. (Обратите внимание, что это не является частью стабильного API Котлина и имеет тенденцию меняться довольно часто.)


Котлин 1.1 поставляется с javax.скрипт (JSR-223) поддержка, что означает, что вы можете использовать его в качестве скриптового движка аналогично JavaScript с Nashorn.