如何解决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
这应该可以帮助您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。