以字符串形式存储的运行Kotlin会导致运行时错误

时间:2019-05-30 20:00:52

标签: android kotlin

基于Dynamically evaluating templated Strings in Kotlin,出于特殊和稀有用途,我尝试运行存储为字符串的 Kotlin 脚本。我的Android Studio已更新(3.4.1)。我的计算机运行Windows

脚本测试存储在here中。

我已经在JS223.Jar文件夹中添加了libs文件,作为一个库添加,并将依赖项放入了gradle(应用程序)中。

源代码是

import javax.script.*


val engine = ScriptEngineManager().getEngineByExtension("kts")!!
engine.eval("val x = 3")
val res = engine.eval("x + 2")

基于实际用法,我从{em> JetBrain / Kotlin 的GitHub复制了setIdeaIoUseFallback()代码,没有依赖性

但是,无论是否进行了setIdeaIoUseFallback()上一次调用,上述代码在ScriptEngineManager()调用中都会出现疯狂的运行时错误

java.lang.NoClassDefFoundError: Failed resolution of: Lsun/misc/Service
Javax.script.ScriptEngineManager.initEngines(ScriptEngineManager.java:90)
javax.script.ScriptEngineManager.access$0(ScriptEngineManager.java:86)
javax.script.ScriptEngineManager$1.run(ScriptEngineManager.java:80)
java.security.AccessController.doPrivileged(AccessController.java:41)
javax.script.ScriptEngineManager.init(ScriptEngineManager.java:78)
javax.script.ScriptEngineManager.<init>(ScriptEngineManager.java:51)    
br.com.greatsolutions.paulo.kotlinfirst.MainActivity.onCreate(MainActivity.kt:65)

1 个答案:

答案 0 :(得分:0)

我通过在gradle脚本中添加以下依赖项来使代码运行

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

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

    runtime "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable"
}

我还将该文件添加到resources \ META_INF \ services \ javax.script.ScriptEngineFactory中,内容如下:

org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

然后我可以运行以下代码

setIdeaIoUseFallback()
val engine = ScriptEngineManager().getEngineByExtension("kts")!!
engine.eval("val x = 3")
val res = engine.eval("x + 2")
Assertions.assertEquals(5, res)