使用javax.script.ScriptEngineManager在JVM中评估Kotlin的问题



我正在尝试使用Java Scripting API评估JVM中的Kotlin代码。

try {
ScriptEngineManager().getEngineByExtension("kts").let {
it.eval("val f: (CommandContext.()->Any?) = {n${this.args.joinToString(" ")}n}; return f") as (CommandContext.()->Any?)
}().let { embed.setDescription(it.toString()) }
} catch (ex: Exception) {
embed.setColor(Color.RED)
embed.setDescription(StringWriter().also { ex.printStackTrace(PrintWriter(it)) }.toString())
}

但是。。。ScriptEngineManager().getEngineByExtension("kts")正在返回一个空值。我已经添加了META-INF/services文件:

文件名:javax.script.ScriptEngineFactory

文件内容:org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

根据JetBrains的说法:https://github.com/JetBrains/kotlin/tree/master/libraries/examples/kotlin-jsr223-local-example

添加后续操作,因为我遇到了同样的错误,但在获得1.3.31的依赖项并添加脚本引擎初始化文件后,我能够使其正常工作。

我的工作依赖项:

plugins {
base
kotlin("jvm") version "1.3.31"
}
...
dependencies {
compile(kotlin("stdlib"))
compile(kotlin("reflect"))
compile(kotlin("script-runtime"))
compile(kotlin("compiler-embeddable"))
compile(kotlin("script-util"))
runtime(kotlin("scripting-compiler-embeddable"))
testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0")
}

您肯定需要添加文件src/main/resources/META-INF/services/javax.script.ScriptEngineFactory.

以下是示例文件:https://github.com/JetBrains/kotlin/blob/master/libraries/examples/kotlin-jsr223-local-example/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory

这段代码应该表明您已经注册了kotlin扩展。

ScriptEngineManager().engineFactories.forEach { println(it.extensions)
...
[kts]
[js]

我刚刚通过添加来修复

compile 'org.jetbrains.kotlin:kotlin-compiler:1.3.11'
compile 'org.jetbrains.kotlin:kotlin-script-runtime:1.3.11'
compile 'org.jetbrains.kotlin:kotlin-script-util:1.3.11'
compile 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.11'

到我的CCD_ 5。

PS:1.3.11是我的Kotlin版本。

从Kotlin 1.3.31或1.4开始,这在build.gradle.kts:中似乎已经足够了

implementation(kotlin("scripting-jsr223"))

现在的工作版本只是:

runtimeOnly("org.jetbrains.kotlin:kotlin-scripting-jsr223:${Deps.JetBrains.Kotlin.VERSION}")

其通过传递引入所有必要的依赖关系。

此外,如果这样做,META-INF/services/javax.script.ScriptEngineFactory文件似乎没有必要。

相关内容

  • 没有找到相关文章

最新更新