首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在胖jar中的Kotlin JSR-223 ScriptEngineFactory -找不到kotlin编译器jar。

在胖jar中的Kotlin JSR-223 ScriptEngineFactory -找不到kotlin编译器jar。
EN

Stack Overflow用户
提问于 2017-06-27 13:24:02
回答 1查看 4.1K关注 0票数 5

我有一个胖罐子,在那里我试图获取Kotlin的ScriptEngine实例。

为了调试的目的,我迭代了可用的脚本引擎工厂,并获得了引擎。

代码语言:javascript
复制
val scriptEngineManager = ScriptEngineManager()
for (factory in scriptEngineManager.engineFactories) {
    val scriptEngine = factory.scriptEngine
}

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

代码语言:javascript
复制
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插件来构建它,它配置如下:

代码语言:javascript
复制
<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>

有什么想法吗?

更新

为了记录在案,我尝试使用相同的结果,同时尝试了KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory和KotlinJsr223JvmLocalScriptEngineFactory。

EN

Stack Overflow用户

回答已采纳

发布于 2017-06-28 08:03:03

kotlin-script-util中的JSR223工厂试图找到编译器jar,以便设置编译。在您的例子中,您需要编写自己的工厂来显式地提供脚本编译类路径。

代码语言:javascript
复制
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 -用于脚本中的基类
  • 您可能需要在脚本中使用的任何其他jars kotlin-stdlib.jar

您可以将您的胖罐子放在那里,但这意味着从它得到的一切都可以从您的脚本中访问。而不是说编译器的管理费用。

票数 9
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44781462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档