在OSGi中的导入机制中,从另一个bundle导入包是很简单的。然而,我尝试导入存在于bundle“根目录”中的资源时却失败了。
是否有可能将非包作用域的资源导入到另一个bundle中?
我想要实现的是:
Bundle A在“根目录”中有一个文件资源
Bundle B导入了Bundle A的包和资源。 通过Bundle B的ClassLoader,我希望能够加载Bundle A中的资源,就像它存在于Bundle B中一样。
在OSGi中的导入机制中,从另一个bundle导入包是很简单的。然而,我尝试导入存在于bundle“根目录”中的资源时却失败了。
是否有可能将非包作用域的资源导入到另一个bundle中?
我想要实现的是:
Bundle A在“根目录”中有一个文件资源
Bundle B导入了Bundle A的包和资源。 通过Bundle B的ClassLoader,我希望能够加载Bundle A中的资源,就像它存在于Bundle B中一样。
位于bundle根目录中的资源属于"default"包,无法导入或导出。
如果您确实需要通过类加载器访问资源,则需要将它们移动到一个包中并导出该包。否则,您可以使用Bundle.getEntry()
从任何bundle的任何位置读取资源。
你可以使用 OSGi Fragment bundles。对于你的情况:bundle B 是主机,而 bundle A 是 bundle B 的一个片段。但是 bundle B 可以访问 bundle A 的所有类和资源(文件夹)。
更多细节请参考 OSGi Core Spec #3.13 中的 Fragment bundles 部分。
ClassLoader c = new URLClassLoader(urls);
thread.setContextClassLoader(c);
线程类加载器将能够加载包内文件,其中URL包括捆绑包的绝对位置。