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

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

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

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

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

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

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

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

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

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

  • Модуль Vert.x 3 для Klutter – я автор, одна из моих библиотек
  • Vert.x 3 помощников для Kotlin – by Cy6erGn0m
  • Kovert, структура REST для Vert.x 3 – я автор, одна из моих библиотек
  • Vert.x nubes – не специфический для Kotlin, но делает Vert.x-Web более дружественным для языков JVM.

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

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

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

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