问题 从OSGi包导入资源


使用OSGi中的导入机制,可以直接从另一个包中导入包。但是,我没有成功导入存在于bundle的“root”中的资源。

是否可以将不是包作用域的资源导入到另一个包中?

我想要实现的是:

Bundle A在“root”中有一个文件资源

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


5044
2017-09-27 04:55


起源

我也正在寻找这个,我能想到的唯一方法是直接从jar中获取它而不使用osgi, download.oracle.com/javase/tutorial/uiswing/components/... ..但这打败了我猜的osgi的目的 - FUD


答案:


捆绑包根目录中的资源位于“默认”包中,无法导入或导出。

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


10
2017-09-27 09:04



谢谢Neil,这正是我需要知道的! - Christer Fahlgren
FWIW,我已经实现了一种解决方法,只需在加载资源时尝试两个ClassLoader。 - Christer Fahlgren


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

OSGi Core Spec#3.13 Fragment包中的更多细节


1
2017-09-27 05:35



不幸的是,Dmitry这两个捆绑包都是现有的jar,我将其作为捆绑包装,如果我理解正确,则一个片段只能连接到一个捆绑包(并且它需要连接到多个捆绑包)。 - Christer Fahlgren
Christer,您可以使用Bundle#findEntries()和Bundle#getEntry()方法获取bundle资源。 - Dmytro Pishchukhin


创建一个新线程,然后创建一个指向所需文件的新类加载器。

看看这个片段:

ClassLoader c = new URLClassLoader(urls);
thread.setContextClassLoader(c);

然后,线程类加载器将能够加载包中的文件,其中URL包括束的绝对位置。


0
2017-08-23 14:34