【问题标题】:Run Kotlin stored as a string is giving a runtime error运行存储为字符串的 Kotlin 会出现运行时错误
【发布时间】:2019-10-16 12:02:22
【问题描述】:

基于Dynamically evaluating templated Strings in Kotlin,我已尝试运行以字符串形式存储的Kotlin 脚本,以用于特殊和稀有用途。我的 Android Studio 已更新 (3.4.1)。我的电脑运行Windows

脚本测试存储在here

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

源码是

import javax.script.*


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

基于实际使用,我从 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)

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    我通过在我的 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)
    

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多