当前位置: 首页 > 知识库问答 >
问题:

NullPointer访问 OSGi 捆绑包资源时的异常

柯易安
2023-03-14

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

在一个包中,我从参考资料中加载了一个文件。我试过不同的方法

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

但我使用哪一个命令并不重要,一开始都很好。但是,在两个框架中执行了几个安装和卸载步骤之后。返回的InputStream为空。

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

经过一点调试,我发现包a得到了

FrameworkUtil.getBundle(XXX.class)

指向正确的jar文件,但是当我在包的BundleData中查找被引用的bundlefile时,它引用了另一个包的bundlefile。bundlefiles是OSGi框架的临时文件(在我的例子中是Equinox),可以在本地Maven存储库中找到:

osgi .m2 \ repository \ org \ eclipse \ \ org.eclipse.osgi \ 3

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

共有2个答案

郭璞
2023-03-14

两个框架使用相同的目录来保存捆绑包的配置。似乎一个框架意外地覆盖了另一个框架的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();
咸弘雅
2023-03-14

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

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

记住,在运行时,一个类对象在类文件、类装入器对中是唯一的。

 类似资料:
  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • 我在试图限制OSGi捆绑包可以执行的操作时遇到了一个问题。根据我阅读的文档,OSGi捆绑包的权限应该在OSGi-INF/permissions中设置。perm文件位于bundle的JAR中。然而,无论我在该文件中写了什么(无论该文件是否存在),bundle似乎都拥有所有权限。更具体地说,我使用命令行启动OSGi 然后我用命令安装捆绑包 和启动它。当我试图执行一个操作t

  • 我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com

  • 我在Apache Felix上开发了一个OSGI捆绑包。捆绑包公开不同的API来实时管理YouTube事件。捆绑包服务将通过REST服务公开,并将由用户通过Web浏览器(chrome、safari、mozilla)使用。 我为该帐户生成凭据Google(client_secret和client_id)并将其保存在文件中,然后我的代码使用此凭据并正常工作。 我使用这个类(在youtube文档中找到)

  • 我正在编写hibernate dto映射osgi包(用于glassfish),这个包没有看到来自类路径的资源。 清单文件: 无法从sqljdbc4.jar访问文件,错误: 但这个库存在于导出的jar文件中。 此外,我无法通过类路径访问hibernate配置文件和映射文件(类未找到和资源未找到异常也)。但下一个代码有效: 我试图调用 在sys out中可以看到: 搜索了捆绑类路径选项,但我的清单似乎

  • 我还不是一个有经验的OSGi用户,因此我会遇到一些问题。 我正在尝试使用作为外部提供程序,因为我不希望我的包包含所有这些类。 但是,当我运行这组包(my和)时,我得到以下错误: 错误:Bundle org.apache.serviceMix.bundles.hadoop-client[56]错误启动文件:bundles/org.apache.serviceMix.bundles.hadoop-cl