Java将选择哪个JS脚本引擎?

时间:2014-10-27 03:48:22

标签: java rhino nashorn scriptengine

ScriptEngineManager.getEngineByName查找并为给定名称创建ScriptEngine。

Rhino将自己注册为“js”,“rhino”,“JavaScript”,“javascript”,“ECMAScript”和“ecmascript”

Nashorn将自己注册为“nashorn”,“Nashorn”,“js”,“JS”,“JavaScript”,“javascript”,“ECMAScript”和“ecmascript”

如果我使用Nashorn和Rhino注册的“js”之类的名称,将使用哪个脚本引擎?它会在Java 8和Rhino上使用Nashorn吗?

2 个答案:

答案 0 :(得分:4)

查看registerEngineName的{​​{3}}:

  

注册ScriptEngineFactory以处理语言名称。覆盖   使用Discovery机制找到的任何此类关联。

还有registerEngineName源代码(注意nameAssociations是哈希映射):

public void registerEngineName(String name, ScriptEngineFactory factory) {
    if (name == null || factory == null) throw new NullPointerException();
        nameAssociations.put(name, factory);
}

因此,似乎对于给定名称,getEngineByName将返回最后为该名称注册的脚本引擎工厂。

当脚本引擎工厂通过JavaDoc机制加载时,加载顺序将取决于相关类加载器枚举服务配置文件的顺序。 ServiceLoader方法。

对于默认安装,所有这些都无关紧要,因为Java 8仅包含Nashorn,而Java 7及更早版本仅包含Rhino。如果你要通过系统类路径添加一个额外的引擎,它将在bootstrap / extension类加载器加载的引擎之后加载,因此优先。

答案 1 :(得分:0)

读取代码,registerEngineName确实是确定性的,但是发现机制是一个单独的东西(如JavaDoc所暗示的),并且它是非确定性的,因为它将所有引擎添加到{{1在发现期间,当按名称要求引擎时,它只使用它找到的第一个匹配。

如果您在Java 7中安装an updated Rhino ScriptEngine并通过任何常用名称(HashSetjs等)请求它,则可以遇到此问题。

但除非你这样做,否则Java 7和Java 8都只有一个实现,它可以回答rhinojsjavascript等等。只要你没有&# 39;要求ecmascriptrhino,它应该适用于这两种情况。