javax.imageio.spi.ServiceRegistry在OSGi容器中工作吗?

时间:2012-09-30 19:23:00

标签: osgi xdocreport

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

的代码的osgi包

javax.imageio.spi.ServiceRegistry

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

我找不到任何具体的文档。我正在使用felix osgi容器。我们将非常感激地收到任何指示。

我怀疑它确实有效,我的问题出在其他地方,因为我注意到在xdocreport osgi bundle fr.opensagres.xdocreport.core中,ServiceRegistry被使用here但是在所有osgi容器上都不支持它?

3 个答案:

答案 0 :(得分:0)

不,它没有。我认为它只会在系统类加载器中发现服务,因此对于bundle来说这是无用的。

可能有一种解决方法,这个post非常有帮助,但我怀疑它是否对您的问题有用。

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

答案 1 :(得分:0)

开箱即用,OSGi不支持此功能,您需要稍微调整一下代码。 但是像Aries SPI Fly和Pax-Swissbox这样的工具可以为你提供支持 使用这些SPI“服务”

答案 2 :(得分: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转换为带有JODConverter的pdf转换器等)。

如您所知, javax.imageio.spi.ServiceRegistry适用于OSGi上下文,因为我们使用OSGi片段(共享相同的类加载器)而不是OSGi包。我们已经做了这个选择,用相同的代码管理非OSGi和OSGi上下文。

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

  1. 如果我们使用OSGi包,我们需要开发一个OSGi Activator来注册我们的发现(在这个上下文包中,javax.imageio.spi.ServiceRegistry不起作用)。
  2. 如果我们使用OSGi包,则需要为注册发现的每个包配置启动级别。
  3. 使用OSGi片段的唯一不足之处在于,您无法在OSGi容器中使用多个版本的XDocReport模板,转换器,文档。但它对XDocReport来说是一个很好的功能吗?

    您不能 javax.imageio.spi.ServiceRegistry 与JDK5(和JDK6)一起使用。 JDK6提供 java.util.ServiceLoader ,它是regsiter服务的新clas,如javax.imageio.spi.ServiceRegistry。

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

    关心安吉洛