javax.imageio.spi.serviceRegistry在OSGI容器中工作吗?
-
11-12-2019 - |
题
如果一个包含调用的代码的OSGI捆绑包,任何人都可以明确地告诉我,其中包含调用的代码
javax.imageio.spi.serviceRegistry 要查找服务(在Meta-Inf \ Service中)将找到该服务,如果该服务实现在另一个捆绑包中。
我找不到对此特定的任何文档。我正在使用felix OSGI容器。任何指针都将被贪心地收到。
我怀疑它确实有效,我的问题在于其他地方,因为我注意到,在xdocreport osgi捆绑fr.opensagres.xdocreport.core
中,ServiceRegistry
获取使用这里也许它不支持所有OSGI容器?
解决方案 3
嗨,谢谢大家的答案。 我认为ServiceRegistry将在OSGI集装箱中工作,以实例化服务,而只是在同一类ClassLoader内。 通过使用 osgi碎片的促进。因此,只要Ifferioner处于一个分段,它将其片段主机定义为包含具有服务良好查找代码的类的捆绑包,那么ServiceRegistry会起作用。
这就是我链接到的xdocreport代码中的原因。 在这种情况下,ServiceLoader代码从 fr.opensagres.xdocreport.core (捆绑),延长在 fr.opensagres.xdocreport.document (因此serviceRegistry调用是在fr.opensagres.xdocreport.document)。服务实现在 fr.opensagres.xdocreport.document.docx 。一个碎片,其定义了它的言言 - 主机为fr.opensagres.xdocreport.document 。
so fr.opensagres.xdocreport.document和fr.opensagres.xdocreport.document.docx使用相同的类加载器...所以它有效!
其他提示
开箱即用,OSGI不支持这个,你需要调整你的代码一点。 但是,像Aries SPI Fly和 pax-swissbox 那样支持你 在使用这些SPI“服务”
否,它没有。我认为它只会在系统类加载器中发现服务,因此捆绑的非常毫无用处。
可能存在一个解决方法,这个 post 是漂亮的有用,虽然我怀疑是否对您的问题有任何用处。
在Xdocreport中,我们希望有一个模块化API报告来管理:
- 任何文件种类(docx,odt,pptx ...)。如果您希望通过javax.imageio.spi.serviceRegistry来注册自己的文档类型,您可以实现自己的文档类型。
- 任何模板引擎类型(Freemarker,速度......)。如果您希望通过javax.imageio.spi.serviceRegistry iserviceRegistry来实现自己的模板类型。
- 任何转换器类型(DOCX-> PDF转换器,带POI + IText,DOCX-> XHTML Converter,带有ODFDOM + ITEXT的POI,ODT-> PDF转换器,ODT-> XHTML转换器具有ODFDOM ......)。如果您希望通过javax.Imageio.spi.serviceRegistry(例如:使用DocX4J + Fop,Docx-> PDF转换器,Docx4J + Fop,Docx-> PDF转换器,请通过javax.imageio.spi.serviceRegistry(例如:Docx4J + Fop,Docx-> PDF转换器,使用Jodconverter等)来实现自己的转换器。
如你所知, javax.imageio.spi.serviceRegistry在OSGi上下文中工作因为我们使用OSGi片段(共享相同的类加载器)而不是OSGI捆绑。我们已经完成了使用相同代码的非OSGI和OSGI上下文来管理非OSGI和OSGI上下文。
我们决定使用OSGI片段而不是OSGI捆绑,因为:
- 如果我们使用OSGI捆绑包,我们需要开发一个OSGI激活器以注册我们的发现(在此上下文中,javax.imageio.spi.serviceRegistry不起作用)。
- 如果我们使用OSGI捆绑包,您需要为寄存器发现的每个捆绑包配置开始级别。
使用OSGI片段的唯一拒绝是您不能在OSGI容器中使用多个版本的Xdocroport模板,转换器,文档。但这是Xdocroport的一个很好的功能吗?
您不能那个 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 。但似乎谷歌应用程序引擎禁止使用此类(请参阅我们的问题132 )。所以我已经为xdocreport 1.0.0 jdkserviceloader 通过java反射管理 java.util.serviceloader 和 javax.imageio.spi .serviceRegistry 用于JDK5和JDK6。
关于安吉洛