任何人都可以明确告诉我是否包含调用
的代码的osgi包javax.imageio.spi.ServiceRegistry
查找服务(在META-INF \ service中)将找到该服务,如果该服务实现在另一个包中。
我找不到任何具体的文档。我正在使用felix osgi容器。我们将非常感激地收到任何指示。
我怀疑它确实有效,我的问题出在其他地方,因为我注意到在xdocreport osgi bundle fr.opensagres.xdocreport.core
中,ServiceRegistry
被使用here但是在所有osgi容器上都不支持它?
答案 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报告:
如您所知, javax.imageio.spi.ServiceRegistry适用于OSGi上下文,因为我们使用OSGi片段(共享相同的类加载器)而不是OSGi包。我们已经做了这个选择,用相同的代码管理非OSGi和OSGi上下文。
我们决定使用OSGi片段而不是OSGi包,因为:
使用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。关心安吉洛