我最近编写了一个小的专业脚本语言,并使用Maven导出符合OSGi的捆绑包,该捆绑包还将服务描述符导出到" META-INF/services/javax.script.ScriptEngineFactory"服务注册表文件中.
问题是虽然OSGi导入和导出包很好,但服务注册表似乎与OSGi不兼容(因为OSGi将其捆绑包保留在通用类路径之外,并为模块使用单独的类加载器).
我的问题是,我认为OSGi与服务发现机制不兼容是正确的,如果没有,我可以添加到我的包元数据中,以便ScriptEngineManager.getEngineFactories()在OSGi环境中列出我的脚本引擎?
Apache Sling确实在OSGi环境中使用这种机制来管理其JSR-233兼容的脚本引擎,主要是通过它的ScriptEngineManagerFactory类[1].有关示例自定义脚本引擎,另请参见[2].
如果JSR-233兼容,则将脚本引擎添加到Sling应该可以正常工作.最简单的测试方法可能是使用你的语言而不是那里使用的服务器端javascript语言,遵循15分钟内的"Sling"教程[3].
[2] http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/javascript
[3] http://sling.apache.org/site/discover-sling-in-15-minutes.html
Matt F.博客写了另一种解决方案[1]
在Java应用程序中提供脚本时,符合JSR 223的脚本引擎(例如Groovy,JRuby,Scala,...)可以使用类似的东西轻松嵌入.
Run Code Online (Sandbox Code Playgroud)ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");但是,在基于OSGi的应用程序中,ScriptEngineManager无法发现位于已安装捆绑包中的脚本引擎,因为它发现了类路径上可用的引擎.幸运的是,Apache Felix项目已经解决了这个问题
- OSGiScriptEngineManager [2]
- OSGiScriptEngineFactory [3]
- OSGiScriptEngine [4]
它提供了一种符合OSGi标准的方法来发现和加载作为OSGi包安装的脚本引擎.
Run Code Online (Sandbox Code Playgroud)ScriptEngineManager scriptEngineManager = new OSGiScriptEngineManager(bundleContext); ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");
现在我们已经有了几年的脚本编写和OSGi经验,一个挑战是简化对OSGi服务的脚本访问.使用ServiceTracker api [5]似乎是唯一的方法; 但这种努力对于简单的脚本来说很高.我们已经努力寻找脚本来表达他们想要的OSGi服务,并代表脚本自动化ServiceTracker调用,但它很脆弱.期待OSGi规范在未来提供更好的支持.
[1] http://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/
[5] https://osgi.org/javadoc/osgi.core/7.0.0/org/osgi/util/tracker/ServiceTracker.html
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |