4

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

这是我的代码:

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

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

我也试过:

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

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

这2个答案建议传递null给构造函数,但它对我不起作用:

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


更新:

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

我不知道它与Java Project有什么不同。

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

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不为

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

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

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

4

4 回答 4

5

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

getEngineByName("JavaScript");
                 ^   ^
于 2015-10-13T06:40:10.720 回答
3

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

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

到这段代码:

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

注意null传入ScriptEngineManager构造函数调用。

于 2019-03-13T18:35:09.723 回答
1

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

于 2016-01-11T14:10:09.400 回答
0

将模块添加jdk.scripting.nashorn到模块图中怎么样?

java --add-modules jdk.scripting.nashorn
于 2021-08-27T10:18:50.440 回答