为什么getEngineByName("js")返回null



无论我尝试什么,getEngineByName()都会一直返回null。

这是我的代码:

final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine engine = manager.getEngineByName("js");

但是engine在这些行之后为空。

我也试过:

  • getEngineByName("javascript")
  • getEngineByName("nashorn")

它们都返回null。实际上,manager.getEngineFactories()显示了一个空数组,这意味着根本没有工厂。

这两个答案建议将null传递给构造函数,但对我来说不起作用:

  • https://stackoverflow.com/a/25332851/900394
  • https://stackoverflow.com/a/25332851/900394

这个答案说这是一个已经修复的错误


更新:

那是eclipse中的一个Android应用程序项目

我不知道它与Java项目有那么大的不同。

现在我刚刚打开了一个新的Java项目,写了这些行,我得到了一些结果:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
public class TestClass {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = scriptEngineManager.getEngineByName("js");
}
}

engine不是null

此外,javax.script.*已成功导入,就好像它已经存在(内置)一样。这是因为我在使用Java 8吗?

在之前的(android)项目中,我使用的是从这里下载的javax.script

那么Android项目中的问题是什么?我该如何解决?

您必须用大写字母编写参数,如下所示:

getEngineByName("JavaScript");
^   ^

显然,在IDE中运行时,即使您使用的是包含Nashorn javascript引擎的最新版本的Java,也必须将null传递到ScriptEngineManager构造函数中,否则它通常不会有引擎。它在实际编译时会很好,似乎是IDE错误。对我来说,它是通过更改这个代码来解决的:

mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("JavaScript");

到此代码:

mgr = new ScriptEngineManager(null);
engine = mgr.getEngineByName("JavaScript");

请注意传递到ScriptEngineManager构造函数调用中的null

您的Java版本不包含JavaScript引擎。Java 8包括Nashorn javascript引擎,通常对Java<->有更好的支持JavaScript互操作性。对于旧版本的Java,您可以将Rhino放在类路径中并使用它。

将模块jdk.scripting.nashorn添加到模块图中如何?

java --add-modules jdk.scripting.nashorn

相关内容

  • 没有找到相关文章

最新更新