1

任何人都可以明确告诉我是否包含调用的代码的 osgi 包

javax.imageio.spi.ServiceRegistry

查找服务(在 META-INF\service 中)将找到该服务,如果该服务实现在另一个包中。

我没有找到任何关于此的特定文档。我正在使用 felix osgi 容器。任何指点将不胜感激。

我怀疑它确实有效,而我的问题出在其他地方,因为我注意到在 xdocreport osgi bundlefr.opensagres.xdocreport.core中,在这里ServiceRegistry使用了它,但可能并非所有 osgi 容器都支持它?

4

4 回答 4

0

不,它没有。我认为它只会在系统类加载器中发现服务,所以这对于捆绑包来说毫无用处。

可能有一种解决方法,这篇文章很有帮助,尽管我怀疑它是否对您的问题有用。

OSGi 5 也将支持它('Service Loader Mediator')。参考实现是来自 Apache Aries 的 SPI Fly

于 2012-09-30T22:01:59.800 回答
0

开箱即用,OSGi 不支持这个,你需要稍微调整你的代码。但是周围有像 Aries SPI Fly 和Pax-Swissbox这样的工具支持您使用这些 SPI“服务”

于 2012-10-02T06:42:26.587 回答
0

嗨,谢谢大家的回答。我认为 ServiceRegistry 将在 osgi 容器中工作以实例化服务,但只能在同一个类加载器中。这可以通过使用osgi 片段来促进。因此,只要实现者位于将其 Fragment-host 定义为包含具有 ServiceRegistry 查找代码的类的包的片段中,那么 ServiceRegistry 就可以工作。

这就是为什么它在我链接到的 xdocreport 代码中工作的原因。在这种情况下,ServiceLoader 代码是从fr.opensagres.xdocreport.core(一个包)中的一个抽象类调用的,该类由 fr.opensagres.xdocreport.document 中的具体类扩展(因此 ServiceRegistry 调用在 fr.opensagres 中 xdocreport.document)。服务实现在fr.opensagres.xdocreport.document.docx中。已将其frament-host 定义为 fr.opensagres.xdocreport.document 的片段。

所以 fr.opensagres.xdocreport.document 和 fr.opensagres.xdocreport.document.docx 使用相同的类加载器......所以它工作!

于 2012-10-10T22:30:56.647 回答
0

在 XDocReport 中,我们希望有一个模块化的 API 报告来管理:

  • 任何文档类型(docx、odt、pptx ...)。如果您愿意,您可以实现自己的文档类型并通过 javax.imageio.spi.ServiceRegistry 注册它。
  • 任何模板引擎类型(Freemarker、velocity...)。如果您愿意,您可以实现自己的模板类型并通过 javax.imageio.spi.ServiceRegistry 注册它。
  • 任何转换器类型(带有 POI+iText 的 docx->pdf 转换器,带有 POI 的 docx->xhtml 转换器,带有 ODFDOM+iText 的 odt->pdf 转换器,带有 ODFDOM 的 odt->xhtml 转换器......)。如果您愿意,您可以实现自己的转换器并通过 javax.imageio.spi.ServiceRegistry 注册它(例如:使用 docx4j+FOP 实现 docx->pdf 转换器,使用 JODConverter 实现 docx->pdf 转换器等)。

正如您所了解的,javax.imageio.spi.ServiceRegistry 在 OSGi 上下文中工作,因为我们使用 OSGi 片段(共享相同的类加载器)而不是 OSGi 包。我们选择使用相同的代码来管理非 OSGi 和 OSGi 上下文。

我们决定使用 OSGi 片段而不是 OSGi 捆绑包,因为:

  1. 如果我们使用 OSGi 包,我们需要开发一个 OSGi 激活器来注册我们的发现(在这个上下文包中,javax.imageio.spi.ServiceRegistry 不起作用)。
  2. 如果我们使用 OSGi 包,您需要为每个注册发现的包配置启动级别。

使用 OSGi 片段的唯一缺点是您不能在您的 OSGi 容器中使用多个版本的 XDocReport 模板、转换器、文档。但它是 XDocReport 的一个好功能吗?

您不能将javax.imageio.spi.ServiceRegistry与 JDK5(和 JDK6)一起使用。JDK6 提供了java.util.ServiceLoader,它是作为 javax.imageio.spi.ServiceRegistry 注册服务的新类。

在 XDocReport 中我们希望支持 JDK5+JDK6。XDocReport 0.9.8 仅使用javax.imageio.spi.ServiceRegistry。但似乎 Google App Engine 禁止使用此类(请参阅我们的问题 132)。所以我为 XDocReport 1.0.0 JDKServiceLoader开发了 Java 反射来管理JDK5 和 JDK6 的java.util.ServiceLoaderjavax.imageio.spi.ServiceRegistry

问候安吉洛

于 2012-10-11T12:10:10.603 回答