我在普通的Java应用程序中使用两个OSGi框架。两个框架都从共享目录加载包。
在一个包中,我从资源加载一个文件。我尝试了不同的方法,
this.getClass().getClassLoader().getResourceAsStream(...)
FrameworkUtil.getBundle(XXX.class).getEntry(...)
FrameworkUtil.getBundle(XXX.class).getResource(...)
但是我使用哪个命令无关紧要,一开始就可以正常工作。但是,在两个框架中执行了几个安装和卸载步骤之后。返回的InputStream为null。
如果只使用一个OSGi框架,我也可以正常工作。
调试一下后,我发现Bundle a得到了
FrameworkUtil.getBundle(XXX.class)
指向正确的jar文件但是当我在Bundle的BundleData中查找引用的bundlefile时,它引用了另一个bundle的bundlefile。 bundlefiles是OSGi框架的临时文件(在我的例子中是Equinox),例如可以在本地Maven存储库中找到:
的.m2 \库\有机\蚀\的OSGi \ org.eclipse.osgi \ 3.6.0.v20100517 \配置\ org.eclipse.osgi \束\ 29 \ 1
任何人都知道这里可能出现什么问题?
答案 0 :(得分:0)
执行资源加载的代码是否从框架中的bundle运行?或者从框架外的代码?
每次解析一个bundle时,它都会获得一个新的类加载器。当捆绑包未解析时(如卸载时),其类加载器将被销毁并与后备存储区断开连接(例如,捆绑jar文件)。因此,您使用的Class对象可能不再有用,因为它是从现在销毁的类加载器加载的。
请记住,在运行时,类对象对于类文件,类加载器对是唯一的。
答案 1 :(得分:0)
两个框架都使用相同的目录来保存包的配置。似乎偶然一个框架覆盖了另一个框架的bundlefile /配置文件。
当捆绑包尝试访问其资源时,它会查找配置文件。如果此文件已被覆盖,则资源文件的条目不再可用,从而导致InputStream的值为null。
为了避免这些问题,可以为每个框架设置不同的配置,例如
Map<String, String> frameworkPropertiesMap = new HashMap<String, String>();
frameworkPropertiesMap.put("osgi.configuration.area", "@user.home/osgi-framework-configuration-" + numberOfFramework);
framework = getFrameworkFactory().newFramework(frameworkPropertiesMap);
framework.start();