热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KotlinJSR-223ScriptEngineFactory里面的胖罐子-找不到kotlin编译jar

如何解决《KotlinJSR-223ScriptEngineFactory里面的胖罐子-找不到kotlin编译jar》经验,为你挑选了1个好方法。

我有一个肥胖的罐子,我正试图得到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 Compiler.我正在使用Maven Assembly Plugin来构建它,它配置如下:


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

有任何想法吗?

更新

为了记录,我尝试了KotlinJsr223JvmLocalScriptEngineFactoryKotlinJsr223JvmDaemonLocalEvalScriptEngineFactory,结果相同.



1> 小智..:

kotlin-script-util中的JSR223工厂正在尝试查找编译器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)
        )
}

您需要将以下罐子放入classpath:

kotlin-script-util.jar - 它包含用作脚本超类的模板类

kotlin-script-runtime.jar - 用于脚本编写的基类

您可能需要在脚本中使用的任何其他罐子 - 很可能 - kotlin-stdlib.jar

您可以将胖罐放在那里,但这意味着可以从脚本中访问它的所有内容.不是在谈论编译器的开销.


推荐阅读
author-avatar
乌鸦_Hrt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有