Является ли OSGi принципиально несовместимым с JSR-223 Scripting Language Discovery? - PullRequest
9 голосов
/ 02 июля 2011

Недавно я написал небольшой специализированный язык сценариев и использовал Maven для экспорта OSGi-совместимого пакета, который также экспортирует дескриптор службы в файл реестра службы "META-INF/services/javax.script.ScriptEngineFactory".

Проблема в том, чтоХотя пакеты импорта и экспорта OSGi в порядке, реестр служб, кажется, несовместим с OSGi (поскольку OSGi не связывает свои пакеты с общим путем к классам и использует отдельные загрузчики классов для модулей).

У меня вопрос, я прав?думая, что OSGi несовместим с механизмом Service Discovery, и если нет, что я могу добавить к своим метаданным пакета, чтобы ScriptEngineManager.getEngineFactories() перечислял мой механизм сценариев в среде OSGi?

Ответы [ 3 ]

7 голосов
/ 03 июля 2011

Apache Sling использует этот механизм в среде OSGi для управления своими JSR-233-совместимыми механизмами сценариев, в основном через класс ScriptEngineManagerFactory [1].Смотрите также [2] для примера пользовательского скриптового движка.

Добавление вашего скриптового движка в Sling должно работать, если оно совместимо с JSR-233.Самый простой способ проверить это, вероятно, следовать учебнику «Слинг за 15 минут» [3], используя ваш язык вместо используемого здесь серверного языка JavaScript.

[1] http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineManagerFactory.java

[2] http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/javascript

[3] http://sling.apache.org/site/discover-sling-in-15-minutes.html

5 голосов
/ 25 мая 2012

Мэтт Ф. написал об альтернативном решении [1]

При предоставлении сценариев в приложении Java механизмы сценариев, соответствующие JSR 223 (например, Groovy, JRuby, Scala, ...), могутлегко внедрить, используя что-то вроде

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");

Однако в приложении на основе OSGi ScriptEngineManager не может обнаружить механизмы сценариев, расположенные в установленных пакетах, из-за способа обнаружения механизмов, доступных в класседорожка.К счастью, проект Apache Felix уже решил эту проблему, есть

  • OSGiScriptEngineManager [2]
  • OSGiScriptEngineFactory [3]
  • OSGiScriptEngine [4]

, которые обеспечивают OSGi-совместимый способ обнаружения и загрузки механизмов сценариев, установленных в виде пакетов OSGi.

ScriptEngineManager scriptEngineManager = new OSGiScriptEngineManager(bundleContext);
ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");

Теперь, когда у нас есть несколько лет опыта в области сценариев и OSGi,Одной из проблем является упрощение доступа сценариев к службам OSGi.Использование API ServiceTracker [5] представляется единственным подходом;но это усилие для простых сценариев.Мы разработали средства для сценариев, чтобы выразить, какие сервисы OSGi они хотят, и автоматизировать вызовы ServiceTracker от имени сценариев, но это хрупко.В ожидании спецификации OSGi, предлагающей лучшую поддержку в будущем.

[1] http://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/

[2] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineManager.java

[3] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineFactory.java

[4] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngine.java

[5] https://osgi.org/javadoc/osgi.core/7.0.0/org/osgi/util/tracker/ServiceTracker.html

0 голосов
/ 28 октября 2016

Просто поймите, что существует стандартное общее решение для использования этих типов сервисов в среде OSGi, поскольку ScriptEngineFactory - не единственный такой случай.Это часть спецификации OSGi Enterprise.и эталонную реализацию можно найти здесь: http://aries.apache.org/modules/spi-fly.html

Тривиально воссоздать функциональность классов Apache Spring с помощью этого механизма, и я считаю, что этот метод намного чище и разумнее, но я понимаюжелание избежать повторной реализации колеса, так сказать.

...