是否可以直接在OSGi上下文中创建新的工厂实例?具体来说,Java API中的newInstance()是什么?
例如,可以调用TransformerFactory.newInstance()还是应该避免?我认为应该没问题,因为它是Java API的一部分,但文档指定META-INF / services用于定位实现。这是否意味着它与OSGi和第三方xml变换器(如Saxon)结合起来并不像预期的那样工作?
在OSGi中使用XML相关工厂(如TransformerFactory)的正确方法是什么?
答案 0 :(得分:1)
您应该避免在OSGi中使用SPI。包含Factory类的bundle的类加载器通常不会看到实现API实现的bundle的META-INF / services。
实现API的bundle应该注册一个或多个OSGi服务,而不是META-INF / services。只能进行实例化和OSGi服务注册的适配器包可以轻松编写。
您可以在" 702 XML分析服务规范"中找到 SAXParser 和 SAXParserFactory 的示例。 OSGi纲要规范。对于 TransformerFactory ,应该使用类似的解决方案。
<强>更新强>
在某些情况下,无法将这些工厂类用作OSGi服务。例如:如果您使用的是使用TransformerFactory的技术。
对于与XML相关的API,我创建了osgi-xmlcommons-full
通过使用该捆绑包,使用XML相关工厂的旧技术更有可能正常运行。为了确保从此捆绑包加载与XML相关的API,建议以排除提及的包的方式覆盖 org.osgi.framework.system.packages 系统属性。
该套装也可在maven-central上找到。