我有两个OSGi包A和B.两者都是使用API /实现模型创建的。两个捆绑包都通过Blueprint机制激活。两个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)。因此,即使我想使用bundle fragment方法,我也需要B来加载客户端指定的片段包(仅在需要的基础上)(比如说它们给出了片段包的符号名称)。请提供与类似问题或任何样本相关的建议或其他帖子。
答案 0 :(得分:1)
访问bundle中资源的最简单方法是使用bundle的classLoader。在捆绑A中,您获得服务MyService并执行:
InputStream is = this.getClass().getResourceAsStream("myresource.xml");
MyService service.doSomething(is);
或者您更喜欢网址:
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中你必须确保使用具有资源可见性的classLoader,而在外面通常只有一个classLoader可以看到所有资源。