从不同的 Bundle 加载资源到 OSGi Bundle

Loading Resource in a OSGi Bundle from a different Bundle

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

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

我阅读了以下内容 post,Neil Bartlett 的回答表明它应该有效。

Access resources in another osgi bundle?

然而,当我读到 getEntry、findEntries、getEntrypath 方法时,他们没有谈论其他包(或者我误解了它)。他们只谈碎片。

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

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

访问包中资源的最简单方法是使用包的类加载器。在捆绑包 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 bundleALoader = this.getClass().getClassLoader();
MyService service.doSomething(bundleALoader, "myresource.xml");

请记住,this.getResource() 将相对于 "this" 的包查找资源,而 classLoder.getResource() 将从名称 [=26] 的顶部查找=].

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