【问题标题】:Why does getEngineByName(“js”) return null?为什么 getEngineByName(“js”) 返回 null?
【发布时间】:2015-07-12 12:28:42
【问题描述】:

无论我尝试什么,getEngineByName() 总是返回 null。

这是我的代码:

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

engine 在这些行之后为空。

我也试过了:

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

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

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

this answer 表示这是一个已修复的错误。


更新:

那是 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) 项目中,我使用的是从 here 下载的 javax.script

那么,Android 项目会出现什么问题,我该如何解决呢?

【问题讨论】:

  • stackoverflow.com/a/10757892/4015623 看看有没有帮助
  • 我有had successgetEngineByExtension("js")
  • @AndrewThompson,同样的问题...
  • @AlaaM。关于这个问题的任何更新?
  • @AlaaM。我试过了,现在可以了。 val jsEngine = ScriptEngineManager().getEngineByName("rhino") 参考此link

标签: java javascript android javax.script


【解决方案1】:

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

getEngineByName("JavaScript");
                 ^   ^

【讨论】:

  • 即使我做了同样的事情,但它仍然是空的
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    到此代码:

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

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

    【讨论】:

    • 试过但仍然面临同样的问题
    • 我试过了,现在可以了。 val jsEngine = ScriptEngineManager().getEngineByName("rhino") 参考此link
    【解决方案4】:

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

    java --add-modules jdk.scripting.nashorn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-26
      • 2016-12-28
      • 2012-04-20
      • 2015-11-25
      • 2015-07-04
      • 2019-09-29
      • 2015-02-25
      • 2015-10-21
      相关资源
      最近更新 更多