【问题标题】:NullPointerException when accessing OSGi bundle resources访问 OSGi 捆绑资源时出现 NullPointerException
【发布时间】:2012-09-05 10:29:14
【问题描述】:

我在一个普通的 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 中查找引用的包文件时,它引用了另一个包的包文件。捆绑文件是 OSGi 框架(在我的例子中是 Equinox)的临时文件,例如可以在本地 Maven 存储库中找到:

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

有人知道这里出了什么问题吗?

【问题讨论】:

    标签: java osgi equinox apache-felix


    【解决方案1】:

    执行资源加载的代码是否从框架中的包运行?还是来自框架外的代码?

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

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

    【讨论】:

    • 我确实从包代码本身加载了包的资源。所以在资源访问的时候,bundle 被解析并且有一个有效的类加载器。问题源于 OSGi 创建的配置文件。在每个配置文件中,OSGi 会保存资源的文件名等。如果两个框架使用相同的配置目录,则会覆盖它们的配置文件,从而导致资源条目丢失。另请参阅我对问题的回答。无论如何,感谢您考虑可能的原因!
    • 当您运行多个框架实例时,您需要为每个框架使用不同的存储位置。见osgi.org/javadoc/r4v43/core/org/osgi/framework/…
    • 设置 org.osgi.framework.storage 以及 osgi.configuration.area 工作正常
    【解决方案2】:

    两个框架使用相同的目录来保存包的配置。似乎一个框架偶然覆盖了另一个框架的捆绑文件/配置文件。

    当捆绑包尝试访问其资源时,它会查找配置文件。如果此文件已被覆盖,则资源文件的条目不再可用,从而导致值为 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();
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2016-03-15
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多