Java API的newInstance和OSGi

时间:2014-11-07 17:56:52

标签: java osgi

是否可以直接在OSGi上下文中创建新的工厂实例?具体来说,Java API中的newInstance()是什么?

例如,可以调用TransformerFactory.newInstance()还是应该避免?我认为应该没问题,因为它是Java API的一部分,但文档指定META-INF / services用于定位实现。这是否意味着它与OSGi和第三方xml变换器(如Saxon)结合起来并不像预期的那样工作?

在OSGi中使用XML相关工厂(如TransformerFactory)的正确方法是什么?

1 个答案:

答案 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-apis及其实现
  • 以在xmlcommons-full bundle中搜索实现的方式覆盖类加载机制

通过使用该捆绑包,使用XML相关工厂的旧技术更有可能正常运行。为了确保从此捆绑包加载与XML相关的API,建议以排除提及的包的方式覆盖 org.osgi.framework.system.packages 系统属性。

该套装也可在maven-central上找到。