【问题标题】:Loading Resource in a OSGi Bundle from a different Bundle从不同的 Bundle 加载 OSGi Bundle 中的资源
【发布时间】:2015-03-13 06:34:43
【问题描述】:

我有两个 OSGi 包 A 和 B。它们都是使用 API/实现模型创建的。这两个捆绑包都通过蓝图机制激活。两个 API 包都导出接口,而实现包不导出任何内容。只有 A 依赖于 B。

我的问题是,我想将位于 bundle A 中的资源文件名(xml 文件)传递给 Bundle B(在我使用 BundleContext.getServiceReferences() 方法获取 B 之后),然后在 Bundle 中加载资源B 并处理它。我怎样才能做到这一点,甚至可行吗?

我阅读了以下帖子,Neil Bartlett 的回答表明它应该可以工作。

Access resources in another osgi bundle?

但是,当我读到 getEntry、findEntries、getEntrypath 方法时,它们并没有谈论其他捆绑包(或者我误解了它)。他们只谈论片段。

我的问题是,我可以使用上述三种方法中的任何一种来实现我想要的吗?如果是这样,您能否指出其他有答案的线程或一些示例代码?

如果这不可能,我可以使用片段包(仅包含资源)吗?同样,Bundle B 更像是一个提供者,它可以获取任何资源文件并对其进行处理并满足客户的请求(Bundle A)。因此,即使我想使用包片段方法,我也需要 B 加载客户端指定的片段包(仅在需要的基础上)(比如他们给片段包符号名称)。请提供与类似问题或任何示例相关的建议或其他帖子。

【问题讨论】:

    标签: osgi


    【解决方案1】:

    访问包中资源的最简单方法是使用包的类加载器。在包 A 中,您将获得服务 MyService 并执行以下操作:

    InputStream is = this.getClass().getResourceAsStream("myresource.xml");
    MyService service.doSomething(is);
    

    或者如果您更喜欢 URL:

    URL url = this.getClass().getResource("myresource.xml");
    MyService service.doSomething(url);
    

    这很有效,因为我们在调用之前已经解析了资源。如果您只想为服务提供一个相对路径,那么您还需要为其提供 classLoader 以从中获取资源。

    ClassLoader bundleALoader = this.getClass().getClassLoader();
    MyService service.doSomething(bundleALoader, "myresource.xml");
    

    请记住,this.getResource() 将相对于“this”的包查找资源,而 classLoder.getResource() 将从名称空间的顶部查找。

    顺便说一句。这些概念在 OSGi 之外也能正常工作。不同之处仅在于在 OSGi 中您必须确保使用具有资源可见性的类加载器,而在外部通常只有一个类加载器可以查看所有资源。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2011-05-05
      • 2021-11-21
      • 1970-01-01
      • 2022-10-04
      • 2013-11-24
      相关资源
      最近更新 更多