【问题标题】:Is OSGi fundamentally incompatible with JSR-223 Scripting Language Discovery?OSGi 从根本上与 JSR-223 脚本语言发现不兼容吗?
【发布时间】:2011-09-27 08:01:28
【问题描述】:

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

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

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

【问题讨论】:

  • 另一个 JSR-223 和 OSGi 不匹配是在运行时脚本通常需要导入类。但是,OSGi 更喜欢 bundle 在构建时通过在 bundle 的 JAR META-INF/MANIFEST.MF 中声明导入来指定导入。带有通配符的 DynamicImports-Package 指令可以以淡化 OSGi 的 JAR 版本管理为代价来解决这个问题。

标签: java osgi jsr223


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      如果 Sling 与 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

      【讨论】:

      • 感谢您的链接。如果用户希望将我的脚本语言集成到 OSGi 环境中,我想我可以参考您的回复。
      • 我知道这是一篇非常古老的帖子,但似乎最后一个链接不包含与以前相同的示例。我正在努力在我的 servlet 中引用该服务
      猜你喜欢
      • 2010-11-12
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多