9

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

问题在于,尽管 OSGi 导入和导出包都很好,但服务注册表似乎与 OSGi 不兼容(因为 OSGi 将其捆绑包远离通用类路径并为模块使用单独的类加载器)。

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

4

3 回答 3

7

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

如果它与 JSR-233 兼容,则将脚本引擎添加到 Sling 应该可以工作。最简单的测试方法可能是按照“Sling in 15 minutes”教程 [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

于 2011-07-03T11:19:25.127 回答
5

Matt F. 写了一篇关于替代解决方案的博客 [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 服务的脚本访问。使用 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

于 2012-05-25T16:11:12.047 回答
0

顺便说一句,在 OSGi 环境中使用这些类型的服务有一个标准的通用解决方案,因为 ScriptEngineFactory 不是唯一的这种情况。它是 OSGi Enterprise 规范的一部分。参考实现可以在这里找到:http: //aries.apache.org/modules/spi-fly.html

通过这种机制重新创建 Apache Spring 类的功能是微不足道的,而且 imo 这种方法更干净、更明智,但我确实理解避免重新实现轮子的愿望。

于 2016-10-28T15:31:16.360 回答