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

Ben*_*ann 5 java rhino scriptengine nashorn

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吗?

Rob*_*sen 4

查看JavaDocregisterEngineName:​

注册 ScriptEngineFactory 来处理语言名称。覆盖使用发现机制发现的任何此类关联。

还有registerEngineName源代码(请注意,这nameAssociations是一个哈希映射):

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

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

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

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