Как я могу указать точную реализацию Rhino вместо встроенной в JDK?

Я использую скрипт Rhino в своем приложении. Я обнаружил, что в разных средах он работает по-разному. Например, на open-jdk этот код не работает

eval("JSON.stringify({id:1})")

тогда как на Oracle JDK работает.

Очевидно, это связано с тем, что каждый JDK содержит собственную реализацию Rhino.

Я добавил следующее в зависимости:

<dependency>
    <groupId>org.mozilla</groupId>
    <artifactId>rhino</artifactId>
    <version>1.7R4</version>
</dependency>

Как я могу указать, чтобы использовать эту реализацию?

Обновление: я вызываю rhino не напрямую, а через API javax.script

new ScriptEngineManager().getEngineByName("JavaScript").eval("JSON.stringify({})")

person Boris    schedule 27.11.2014    source источник
comment
что такое простой JDK?   -  person eis    schedule 27.11.2014
comment
Возможно, вы говорите о разных версиях Rhino? Rhino — это «реализация», она только одна. Но, конечно, существуют разные версии, и, возможно, доступные API-интерфейсы Javascript различны в каждой версии. В ридми JDK на самом деле объясняется, как именно это было сделано для вас: jdk7.java.net/rhino /README.TXT . На всякий случай гниения ссылок: пакеты в комплекте Rhino были изменены, поэтому вы можете использовать более позднюю версию, просто используя соответствующие оригинальные пакеты Rhino.   -  person Gimby    schedule 27.11.2014
comment
Я вижу, что смущает. Пытаюсь вызывать rhino не напрямую, а через javax.script API.   -  person Boris    schedule 27.11.2014
comment
Вот почему я не могу просто изменить пакет Rhino.   -  person Boris    schedule 27.11.2014
comment
getEngineFactories() — добавление jar-файла в путь к классу с обработчиком сценариев добавит обработчик сценариев через Java SPI (интерфейс поставщика услуг). Так что просто перечислите все механизмы сценариев и посмотрите, какой из них является желаемым JavaScript/ECMAScript. Имя реализующего класса интерфейса обработчика сценариев должно давать достаточную идентификацию.   -  person Joop Eggen    schedule 06.03.2015


Ответы (1)


Вам нужна реализация javax.script.ScriptEngine, которая использует пакет org.mozilla.javascript, а не реализацию JDK, которая использует переупакованный пакет sun.org.mozilla.javascript.internal.

de.christophkraemer:rhino-script-engine — такая реализация, заимствованная из OpenJDK источник. Подробнее здесь.

person seanf    schedule 06.03.2015