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

javax.imageio.spi.ServiceRegistry是否在OSGi容器中工作?,osgi,xdocreport,Osgi,Xdocreport,有谁能确切地告诉我,如果一个包含调用 要在META-INF中查找服务,如果该服务实现位于另一个捆绑包中,则service将查找该服务 我没有找到任何关于这方面的文档。我正在使用felix osgi容器。任何指点都将受到感激 我怀疑它确实有效,我的问题在别处,因为我注意到在xdocreport osgi bundle fr.opensagres.xdocreport.core中,ServiceRegistry得到了使用,但可能并非所有osgi容器都支持它?不,它没有。我认为它只会在系统类加载器中发

有谁能确切地告诉我,如果一个包含调用

要在META-INF中查找服务,如果该服务实现位于另一个捆绑包中,则service将查找该服务

我没有找到任何关于这方面的文档。我正在使用felix osgi容器。任何指点都将受到感激


我怀疑它确实有效,我的问题在别处,因为我注意到在xdocreport osgi bundle fr.opensagres.xdocreport.core中,ServiceRegistry得到了使用,但可能并非所有osgi容器都支持它?

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

可能有一个解决方法,这是非常有用的,尽管我怀疑它是否对您的问题有用


此外,OSGi 5还将支持it“服务加载程序中介”。参考实现是现成的,OSGi不支持这一点,您需要稍微调整一下代码。 但是有一些工具,比如Aries SPI Fly,支持你
在使用这些SPI服务时

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

这就是为什么它在我链接的xdocreport代码中工作。 在这种情况下,ServiceLoader代码是从捆绑包中的抽象类调用的,该类由中的具体类扩展,因此ServiceRegistry调用位于fr.opensagres.xdocreport.document中。服务实现正在进行中。已定义其属性的片段


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

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

任何文档类型docx、odt、pptx。。。。如果愿意,您可以实现自己的文档类型,并通过javax.imageio.spi.ServiceRegistry进行注册。 任何模板引擎类型自由标记,速度。。。。如果愿意,您可以实现自己的模板类型,并通过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捆绑包,因为:

如果我们使用OSGi包,我们需要开发一个OSGi激活器来在这个上下文包中注册我们的发现,javax.imageio.spi.ServiceRegistry不起作用。 如果我们使用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。但谷歌应用引擎似乎禁止使用这个类。因此,我为XDocReport 1.0.0开发了一个应用程序,用Java反射管理JDK5和JDK6的Java.util.ServiceLoader和javax.imageio.spi.ServiceRegistry


关于Angelo,在ApacheSling中,我们有一个桥来检测包含脚本引擎META-INF/服务信息的包。不确定这是否适用于这种情况,但您可能希望通过BundleListener了解这是如何做到的,BundleListener会对捆绑包进行反思,以找到它们可以提供什么。Service Loader Mediator规范确实有一个实现:@anierbeck.提到的SPI Fly。OSGi不会在没有参考实现和符合性测试工具包的情况下发布规范!但是我不知道SPI Fly是否能解决这个问题,因为它与java.util.ServiceLoader有点不同。因为xdocreport 1.0 ServiceRegistry被ServiceLoader JDK6依赖项替换,请参阅