1

Based on Dynamically evaluating templated Strings in Kotlin, I've tried, for special and rares uses, run Kotlin scripts stored as strings. My Android Studio is updated (3.4.1). My computer runs Windows.

The script test is stored here.

I've added JS223.Jar file in the libs folder, added as a library and put a dependence in the gradle (app).

The source code is

import javax.script.*


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

Based on a real usage, I've copied from JetBrain/Kotlin in GitHub the setIdeaIoUseFallback() code without dependence

However, with or without setIdeaIoUseFallback() previous call , the above code gives a crazy runtime error in ScriptEngineManager() call

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)
Paulo Buchsbaum
  • 2,471
  • 26
  • 29

1 Answers1

1

I made my code run by adding the following dependencies in my gradle script

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"
}

Also I added the file in resources\META_INF\services\javax.script.ScriptEngineFactory with the following content:

org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

I was then able to run the following code

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