Java API的newInstance和OSGi

标签 java osgi

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

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

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

最佳答案

您应该避免在 OSGi 中使用 SPI。包含 Factory 类的 bundle 的类加载器通常看不到实现 API 的 bundle 的 META-INF/服务。

实现 API 的包应该注册一个或多个 OSGi 服务,而不是 META-INF/services。可以轻松编写仅进行实例化和 OSGi 服务注册的适配器包。

您可以在 OSGi 纲要规范的“702 XML 解析器服务规范”中找到 SAXParserSAXParserFactory 的示例。对于 TransformerFactory 来说,应该使用类似的解决方案。

更新

在某些情况下,无法将这些工厂类用作 OSGi 服务。例如:如果您使用使用 TransformerFactory 的技术。

对于我创建的 XML 相关 API osgi-xmlcommons-full那个

  • 包含 xml-api 及其实现
  • 以在 xmlcommons-full 包中搜索实现的方式覆盖类加载机制

通过使用该 bundle ,使用 XML 相关工厂的旧技术将更有可能正常工作。为了确保从此包中加载与 XML 相关的 API,建议以排除上述包的方式覆盖 org.osgi.framework.system.packages 系统属性。 p>

该 bundle 还可在 maven-central 上获取。 .

关于Java API的newInstance和OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807201/

相关文章:

java - 是否有真正的理由将 Java main 放在公共(public)类中?

java - 更新客户端 bundle 时,未更新的 bundle 中出现 UnsatisfiedLinkError

java - Maven OSGi 项目可以编译,但无法运行

c# - Microsoft 插件框架与 OSGi?

osgi - osgi 中的bundle activate 和 deactivate 方法是否需要同步

Hibernate、JDBC 驱动程序和 OSGi 问题

java - 当我运行以下代码时,它给了我一个 NullPointerException – 我该如何修复它?

JavaFX:每当显示应用程序时如何更改组件/节点位置?

java - 要使用 SSL,我的 JAR 文件是否应该签名?

java - 为什么从类加载文件与类加载器加载文件的结果不一致