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

anhgbhbe  于 2024-01-07  发布在  Java
关注(0)|答案(4)|浏览(176)

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

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

字符串
但是. 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

lnxxn5zx

lnxxn5zx1#

添加一个跟进,因为我得到了相同的错误,但在获得1.3.31的依赖关系并添加脚本引擎初始化文件后,我能够让它工作。
我的工作依赖项:

  1. plugins {
  2. base
  3. kotlin("jvm") version "1.3.31"
  4. }
  5. ...
  6. dependencies {
  7. compile(kotlin("stdlib"))
  8. compile(kotlin("reflect"))
  9. compile(kotlin("script-runtime"))
  10. compile(kotlin("compiler-embeddable"))
  11. compile(kotlin("script-util"))
  12. runtime(kotlin("scripting-compiler-embeddable"))
  13. testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0")
  14. testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0")
  15. }

字符串
您肯定需要添加文件src/main/resources/META-INF/services/javax. script. ScriptEngineFactory。
以下是示例文件:https://github.com/JetBrains/kotlin/blob/c2b5c1178165c1a4820d155f3ab1a7496a621dd3/libraries/examples/kotlin-jsr223-local-example/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
这段代码应该表明您已经注册了Kotlin扩展。

  1. ScriptEngineManager().engineFactories.forEach { println(it.extensions)
  2. ...
  3. [kts]
  4. [js]

展开查看全部
xwbd5t1u

xwbd5t1u2#

我只是通过添加

  1. compile 'org.jetbrains.kotlin:kotlin-compiler:1.3.11'
  2. compile 'org.jetbrains.kotlin:kotlin-script-runtime:1.3.11'
  3. compile 'org.jetbrains.kotlin:kotlin-script-util:1.3.11'
  4. compile 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.11'

字符串
我的build.gradle

**PS:**1.3.11是我的Kotlin版本。

9njqaruj

9njqaruj3#

从Kotlin1.3.31或1.4开始,这似乎在build.gradle.kts中就足够了:

  1. implementation(kotlin("scripting-jsr223"))

字符串

3xiyfsfu

3xiyfsfu4#

现在的工作版本很简单:

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

字符串
其可传递地拉入所有必要的依赖性。
此外,META-INF/services/javax.script.ScriptEngineFactory文件似乎是不必要的,如果这样做。

相关问题