Какой JS Script Engine выберет Java?

ScriptEngineManager.getEngineByName ищет и создает ScriptEngine для заданного имени.

Rhino регистрируется как «js», «rhino», «JavaScript», «javascript», «ECMAScript» и «ecmascript».

Nashorn регистрируется как «nashorn», «Nashorn», «js», «JS», «JavaScript», «javascript», «ECMAScript» и «ecmascript».

Если я использую такое имя, как «js», под которым зарегистрированы и Nashorn, и Rhino, какой скриптовый движок будет использоваться? Будет ли он использовать Nashorn на Java 8 и Rhino в противном случае?


person Ben McCann    schedule 27.10.2014    source источник


Ответы (2)


Глядя на JavaDoc для registerEngineName:

Регистрирует ScriptEngineFactory для обработки имени языка. Переопределяет любую такую ​​связь, обнаруженную с помощью механизма обнаружения.

А также в исходном коде 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. Если вы добавите дополнительный механизм через путь системного класса, он будет загружен после того, который загружен загрузчиком классов начальной загрузки/расширения, и, таким образом, будет иметь приоритет.

person Robby Cornelissen    schedule 27.10.2014
comment
Это не совсем правильно, потому что механизм обнаружения вообще не использует registerEngineName. Если никакие имена не были зарегистрированы явно, вы фактически получаете первый соответствующий движок, который выскакивает из файла HashSet. Это более случайный порядок, чем порядок загрузчика классов, потому что он сводится к java.lang.Object.hashCode и варьируется от одного запуска к другому. - person seanf; 06.03.2015

Читая код, registerEngineName действительно детерминирован, однако механизм обнаружения - это отдельная вещь (как подразумевается в JavaDoc), и он недетерминирован, потому что он добавляет все механизмы в HashSet во время обнаружения и когда запрашивается механизм по имени он просто использует первое совпадение, которое находит.

Вы можете столкнуться с этим, если установите обновленный Rhino ScriptEngine в Java 7 и запросите его под любым из обычных имен (js , rhino и т. д.).

Но если вы этого не сделаете, и Java 7, и Java 8 поставляются с ровно одной реализацией, которая отвечает на js, javascript, ecmascript и т. д. Пока вы не запрашиваете rhino или nashorn, это должно работать в обоих случаях.

person seanf    schedule 06.03.2015