首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin javax.script支持示例

Kotlin javax.script支持示例
EN

Stack Overflow用户
提问于 2020-10-27 19:03:25
回答 1查看 1K关注 0票数 1

我试图编译来自Kotlin网站的javax.script示例

代码语言:javascript
复制
import javax.script.*

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

但是它抛出了一个NullPointerException

代码语言:javascript
复制
$ 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)

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

我正在使用:

代码语言:javascript
复制
kotlinc-jvm 1.4.10 (JRE 11.0.9+11-post-Debian-1deb10u1)

更新:更多的测试

代码语言:javascript
复制
$ 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的类型系统旨在从我们的代码中消除NullPointerException”

有趣的。不知何故。

更新: Java示例

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

来源

代码语言:javascript
复制
import groovy.util.Eval;

public class MetaEval
{
  public static void main (String... args)
  {
    System.out.println (Eval.me ("2+3"));
  }
}

编译

代码语言:javascript
复制
$ /usr/lib/jvm/java-8-openjdk-amd64/bin/javac -cp .:/usr/share/java/groovy-all.jar MetaEval.java

代码语言:javascript
复制
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp .:/usr/share/java/groovy-all.jar MetaEval 
5
EN

回答 1

Stack Overflow用户

发布于 2020-10-31 14:55:37

很可能您在项目中丢失了javax.script.ScriptEngineFactory文件。如果您查看链接的发布说明文档中的全例,您将看到项目在META-INF/services/目录下有javax.script.ScriptEngineFactory文件。

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

代码语言:javascript
复制
org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory

这应该能让你走了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64561282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档