无论我尝试什么,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