OSGi从根本上与JSR-223脚本语言发现不兼容吗?

Chr*_*ris 9 java osgi jsr223

我最近编写了一个小的专业脚本语言,并使用Maven导出符合OSGi的捆绑包,该捆绑包还将服务描述符导出到" META-INF/services/javax.script.ScriptEngineFactory"服务注册表文件中.

问题是虽然OSGi导入和导出包很好,但服务注册表似乎与OSGi不兼容(因为OSGi将其捆绑包保留在通用类路径之外,并为模块使用单独的类加载器).

我的问题是,我认为OSGi与服务发现机制不兼容是正确的,如果没有,我可以添加到我的包元数据中,以便ScriptEngineManager.getEngineFactories()在OSGi环境中列出我的脚本引擎?

Ber*_*taz 7

Apache Sling确实在OSGi环境中使用这种机制来管理其JSR-233兼容的脚本引擎,主要是通过它的ScriptEngineManagerFactory类[1].有关示例自定义脚本引擎,另请参见[2].

如果JSR-233兼容,则将脚本引擎添加到Sling应该可以正常工作.最简单的测试方法可能是使用你的语言而不是那里使用的服务器端javascript语言,遵循15分钟内的"Sling"教程[3].

[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


buz*_*791 5

Matt F.博客写了另一种解决方案[1]

在Java应用程序中提供脚本时,符合JSR 223的脚本引擎(例如Groovy,JRuby,Scala,...)可以使用类似的东西轻松嵌入.

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");
Run Code Online (Sandbox Code Playgroud)

但是,在基于OSGi的应用程序中,ScriptEngineManager无法发现位于已安装捆绑包中的脚本引擎,因为它发现了类路径上可用的引擎.幸运的是,Apache Felix项目已经解决了这个问题

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

它提供了一种符合OSGi标准的方法来发现和加载作为OSGi包安装的脚本引擎.

ScriptEngineManager scriptEngineManager = new OSGiScriptEngineManager(bundleContext);
ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");
Run Code Online (Sandbox Code Playgroud)

现在我们已经有了几年的脚本编写和OSGi经验,一个挑战是简化对OSGi服务的脚本访问.使用ServiceTracker api [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