Kotlin JSR-223 ScriptEngineFactory в толстой банке – Не удается найти компилятор kotlin компилятора

У меня есть толстая банка, где я пытаюсь получить экземпляр ScriptEngine Котлина.

Для целей отладки я выполняю итерацию через доступные серверные заводы сценариев и получаю двигатели.

 val scriptEngineManager = ScriptEngineManager() for (factory in scriptEngineManager.engineFactories) { val scriptEngine = factory.scriptEngine } 

Когда он попадает на движок Котлина, он выходит из строя со следующим исключением:

 Exception in thread "main" java.io.FileNotFoundException: Cannot find kotlin compiler jar, set kotlin.compiler.jar property to proper location at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt$kotlinCompilerJar$2.invoke(KotlinJsr223ScriptEngineFactoryExamples.kt:100) at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt$kotlinCompilerJar$2.invoke(KotlinJsr223ScriptEngineFactoryExamples.kt) at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:130) at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt.getKotlinCompilerJar(KotlinJsr223ScriptEngineFactoryExamples.kt) at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt.access$getKotlinCompilerJar$p(KotlinJsr223ScriptEngineFactoryExamples.kt:1) at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory.getScriptEngine(KotlinJsr223ScriptEngineFactoryExamples.kt:56) at davidsiro.invoices.InvoiceGeneratorKt.generateInvoice(invoiceGenerator.kt:16) at davidsiro.invoices.MainKt.main(main.kt:11) 

Моя жирная банка содержит все зависимости (хотя и распакованы), включая Kotlin Compiler. Я использую Maven Assembly Plugin для его создания, который настроен так:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <archive> <manifest> <mainClass>${main.class}</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> 

Есть идеи?

Обновить

Для записи я попытался как с KotlinJsr223JvmLocalScriptEngineFactory, так и с KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory с тем же результатом.

    Заводы JSR223 в kotlin-script-util пытаются найти компилятор, чтобы настроить компиляцию. В вашем случае вам нужно будет написать свой собственный завод, чтобы явно указать путь класса компиляции скрипта, например

     class MyScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() { override fun getScriptEngine(): ScriptEngine = KotlinJsr223JvmLocalScriptEngine( Disposer.newDisposable(), this, classpath, // !!! supply the script classpath here KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!, { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, arrayOf(Bindings::class) ) } 

    Вам нужно поставить следующие jars в classpath :

    • kotlin-script-util.jar – он содержит класс шаблонов, используемый в качестве суперкласса для скрипта
    • kotlin-script-runtime.jar – для базовых классов, используемых в сценариях
    • любые другие банки, которые вам понадобятся для использования в ваших сценариях, вполне вероятно – kotlin-stdlib.jar

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

    Intereting Posts
    Как открыть ссылки, не связанные с URL веб-браузера в браузере из приложения При инъекции зависимостей Кодина я не хочу распространять экземпляры кодеина повсюду Неразрешенная ссылка при ссылке на Java-код из тестов Kotlin в проекте Spring Boot с использованием Gradle Recruit-MP LightCalendarView – ошибка раздувания класса, noSuchMethodException Kotlin: Как получить и установить текст в TextView на Android с помощью Kotlin? Kotlin JPA Инкапсулируйте OneToMany Что такое файлы .kotlin_builtins и могу ли я их опустить из моих uberjars? Внедрение интерфейса анонимно в Kotlin приводит к ошибке «не имеет конструкторов» Использование @ Component.Builder с параметрами конструктора Как проверить код Kotlin при компиляции на JavaScript? Котлин | Merge 2 ArrayList <Int> В одном массиве ArrayList <Int> Kotlin view object полное имя типа в студии Android в Mac OS Наследование Котлина с дженериками Копирование документов KDoc с одного метода на другой Лучший способ справиться с таким сценарием, где «умный литье невозможно»