访问OSGi包资源时出现NullPointerException

时间:2012-09-12 11:51:19

标签: java osgi equinox apache-felix

我在普通的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

任何人都知道这里可能出现什么问题?

2 个答案:

答案 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();
相关问题