基于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)
答案 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)