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吗?
解决方法:
查看JavaDoc for registerEngineName:
Registers a ScriptEngineFactory to handle a language name. Overrides
any such association found using the Discovery mechanism.
还有registerEngineName源代码(注意nameAssociations是一个哈希映射):
public void registerEngineName(String name, ScriptEngineFactory factory) {
if (name == null || factory == null) throw new NullPointerException();
nameAssociations.put(name, factory);
}
因此,似乎对于给定名称,getEngineByName将返回最后要为该名称注册的脚本引擎工厂.
当脚本引擎工厂通过ServiceLoader
机制加载时,加载顺序将取决于相关类加载器的getResources
方法枚举服务配置文件的顺序.
对于默认安装,所有这些都无关紧要,因为Java 8仅包含Nashorn,而Java 7及更早版本仅包含Rhino.如果要通过系统类路径添加其他引擎,它将在引导程序/扩展类加载器加载的引擎之后加载,因此优先.