繁体   English   中英

访问OSGi捆绑包资源时发生NullPointerException

[英]NullPointerException when accessing OSGi bundle resources

我在一个普通的Java应用程序中使用了两个OSGi框架。 这两个框架都从共享目录加载捆绑包。

在一个捆绑包中,我从资源中加载文件。 我尝试了不同的方法,例如

this.getClass().getClassLoader().getResourceAsStream(...)
FrameworkUtil.getBundle(XXX.class).getEntry(...)
FrameworkUtil.getBundle(XXX.class).getResource(...)

但是我使用哪个命令都没有关系,一开始一切都很好。 但是,在两个框架中都执行了几个安装和卸载步骤之后。 返回的InputStream为null。

如果仅使用一个OSGi框架,我也可以正常工作。

调试了一点之后,我发现Bundle有了

FrameworkUtil.getBundle(XXX.class)

当我在Bundle的BundleData中查找引用的bundlefile时,它指向正确的jar文件,但它引用了另一个bundle的bundlefile。 捆绑文件是OSGi框架(在我的情况下为Equinox)的临时文件,例如,可以在本地Maven存储库中找到:

.m2 \\ repository \\ org \\ eclipse \\ osgi \\ org.eclipse.osgi \\ 3.6.0.v20100517 \\ configuration \\ org.eclipse.osgi \\ bundles \\ 29 \\ 1

任何人都知道这里可能有什么问题吗?

进行资源加载的代码是否从框架中的捆绑运行? 还是来自框架之外的代码?

每次解析包时,它都会获得一个新的类加载器。 当捆绑软件变得无法解析时(例如卸载时),其类加载器将被破坏并与后备存储断开连接(例如捆绑软件jar文件)。 因此,您使用的Class对象可能不再有用,因为它是从现已销毁的类加载器加载的。

请记住,在运行时,类对象是类文件(类加载器对)唯一的。

这两个框架使用相同的目录来保存捆绑软件的配置。 偶然地,一个框架覆盖了另一个框架的bundlefile /配置文件。

当捆绑软件尝试访问其资源时,它将查找配置文件。 如果该文件已被自动覆盖,为资源文件中的条目已不存在,导致有null值的InputStream。

为避免此类问题,可以为每个框架设置不同的配置目录,例如

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM