Kotlin javax.script支持示例 更新:更多测试更新:Java示例

问题描述

我尝试编译javax.script example from the Kotlin web site

import javax.script.*

fun main () {
  val engine = ScriptEngineManager().getEngineByExtension("kts")!!
  engine.eval("val x = 3")
  println (engine.eval("x + 2"))  // Prints out 5
}

但是它抛出了NullPointerException

$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar 
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)

有人知道这是怎么回事吗?我需要其他一些编译选项吗?

我正在使用:

kotlinc-jvm 1.4.10 (JRE 11.0.9+11-post-Debian-1deb10u1)

更新:更多测试

$ kotlinc-jvm hello.kt 
$ kotlin HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: javax/script/ScriptEngineManager
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
        at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
        at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
Caused by: java.lang.classNotFoundException: javax.script.ScriptEngineManager
        at java.base/java.net.urlclassloader.findClass(urlclassloader.java:471)
        at java.base/java.lang.classLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
        ... 9 more
$ kotlin -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
        at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
        at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
$ java -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.script.jsr223.Kotlinjsr223JvmLocalScriptEngineFactory not found
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.mainKts.jsr223.Kotlinjsr223MainKtsScriptEngineFactory Could not be instantiated
Exception in thread "main" java.lang.NullPointerException
        at HelloKt.main(hello.kt:4)
        at HelloKt.main(hello.kt)

NullPointerException遍布各地,尽管"Kotlin's type system is aimed to eliminate NullPointerException's from our code"

好笑。不知何故。

更新:Java示例

我想将以下Java / Groovy示例移植到Kotlin / Kotlin。

资源
import groovy.util.Eval;

public class MetaEval
{
  public static void main (String... args)
  {
    System.out.println (Eval.me ("2+3"));
  }
}
编译
$ /usr/lib/jvm/java-8-openjdk-amd64/bin/javac -cp .:/usr/share/java/groovy-all.jar MetaEval.java
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp .:/usr/share/java/groovy-all.jar MetaEval 
5

解决方法

您的项目中很可能缺少 javax.script.ScriptEngineFactory 文件。如果查看链接的发行说明文档中的full example,您将看到项目在javax.script.ScriptEngineFactory目录下有META-INF/services/文件。

您需要在项目中进行类似的设置,文件内容为:

org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

这应该可以帮助您。