Kotlin JSR-223在Fat jar中的ScriptEngineFactory – 找不到kotlin编译器jar

我有一个胖的jar,我试图获得Kotlin的ScriptEngine的实例。

为了调试的目的,我正在遍历可用的脚本引擎工厂并获取引擎。

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

当它击中Kotlin的引擎时,它会失败,除了以下例外:

 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) 

我的胖jar包含所有的依赖(虽然解压),包括Kotlin编译器。 我正在使用Maven Assembly Plugin来构建它,其配置如下:

  org.apache.maven.plugins maven-assembly-plugin 2.6   make-assembly package  single     ${main.class}    jar-with-dependencies      

有任何想法吗?

更新

为了记录,我试图同时使用KotlinJsr223JvmLocalScriptEngineFactoryKotlinJsr223JvmDaemonLocalEvalScriptEngineFactory

kotlin-script-util中的JSR223工厂正在试图find编译器jar来设置编译。 在你的情况下,你需要编写自己的工厂来明确地提供脚本编译类路径,例如

 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) ) } 

你需要把下面的jar放到classpath

  • kotlin-script-util.jar – 它包含用作脚本超类的模板类
  • kotlin-script-runtime.jar – 用于编写脚本的基类
  • 你需要在你的脚本中使用任何其他的jar,很有可能 – kotlin-stdlib.jar

你可以把你的胖jar子放在那里,但是这意味着它的一切都可以从你的脚本访问。 不是在讨论编译器的开销。