使用OSGi中的导入机制,可以直接从另一个包中导入包。但是,我没有成功导入存在于bundle的“root”中的资源。
是否可以将非封装范围的资源导入另一个捆绑包?
我想要达到的目的是:
Bundle A在“root”中有一个文件资源
Bundle B导入bundle A:s包和资源。 通过bundle B:s ClassLoader,我希望能够在bundle A中加载资源,就好像它存在于Bundle B中一样。
答案 0 :(得分:10)
捆绑包根目录中的资源位于“默认”包中,无法导入或导出。
如果您真的必须通过类加载器访问资源,则需要将它们移动到包中并导出该包。否则,您可以使用Bundle.getEntry()
从任何捆绑包的任何位置读取资源。
答案 1 :(得分:1)
您可以使用OSGi Fragment捆绑包。对于您的情况:bundle B是一个主机,bundle A是bundle B的一个片段。但是bundle B可以访问bundle A的所有类和资源(文件夹)。
OSGi Core Spec#3.13 Fragment包中的更多细节
答案 2 :(得分:0)
创建一个新线程,然后创建一个指向所需文件的新类加载器。
看看这个片段:
ClassLoader c = new URLClassLoader(urls);
thread.setContextClassLoader(c);
然后,线程类加载器将能够加载包中的文件,其中URL包括束的绝对位置。