从OSGi bundle导入资源

11

在OSGi中的导入机制中,从另一个bundle导入包是很简单的。然而,我尝试导入存在于bundle“根目录”中的资源时却失败了。

是否有可能将非包作用域的资源导入到另一个bundle中?

我想要实现的是:

Bundle A在“根目录”中有一个文件资源

Bundle B导入了Bundle A的包和资源。 通过Bundle B的ClassLoader,我希望能够加载Bundle A中的资源,就像它存在于Bundle B中一样。


我也在寻找完全相同的东西,我能想到的唯一方法是直接从jar包中获取它,而不使用osgi,http://download.oracle.com/javase/tutorial/uiswing/components/icon.html#getresource...但我想这违背了osgi的初衷。 - FUD
3个回答

10

位于bundle根目录中的资源属于"default"包,无法导入或导出。

如果您确实需要通过类加载器访问资源,则需要将它们移动到一个包中并导出该包。否则,您可以使用Bundle.getEntry()从任何bundle的任何位置读取资源。


谢谢Neil,这正是我需要知道的! - Christer Fahlgren
顺便说一句,我已经实现了一个解决方法,当加载资源时,它会尝试两个类加载器。 - Christer Fahlgren

1

你可以使用 OSGi Fragment bundles。对于你的情况:bundle B 是主机,而 bundle A 是 bundle B 的一个片段。但是 bundle B 可以访问 bundle A 的所有类和资源(文件夹)。

更多细节请参考 OSGi Core Spec #3.13 中的 Fragment bundles 部分。


很抱歉,Dmitry。这两个包都是我正在打包的现有JAR包,如果我理解正确,一个片段只能附加到一个捆绑包中(并且需要连接到多个捆绑包)。 - Christer Fahlgren
Christer,您可以使用Bundle#findEntries()和Bundle#getEntry()方法获取捆绑资源。 - Dmytro Pishchukhin

0
创建一个新线程,然后创建一个指向所需文件的新类加载器。
看一下这个片段:
ClassLoader c = new URLClassLoader(urls);
thread.setContextClassLoader(c);

线程类加载器将能够加载包内文件,其中URL包括捆绑包的绝对位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接