gpt4 book ai didi

java - 从 FrameworkUtil 类获取 BundleContext 后抛出 NPE

转载 作者:行者123 更新时间:2023-12-01 14:12:47 24 4
gpt4 key购买 nike

我按照本教程将 OSGi 嵌入到我的基于 Maven 的应用程序中。我有一个类文件,用于创建并启动如上所述的框架 here它在那里工作得很好,因为我可以轻松获取 BundleContext。

我已在 pom.xml 文件中添加了此依赖项。

    <dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.url</groupId>
<artifactId>pax-url-mvn</artifactId>
<version>1.3.6</version>
</dependency>

现在,当我运行整个框架时,当它到达同一个基于 Maven 的项目中的新类文件之一时,我需要使用 BundleContext 所以我想我可以使用这一 block 获取 BundleContext 的代码`

FrameworkUtil.getBundle(ModelProcessor.class).getBundleContext();

但不知怎的,上面的代码抛出了我NullPointerException,然后我尝试打印出来看看发生了什么 -

System.out.println(FrameworkUtil.getBundle(ModelProcessor.class));

所以上面的行打印 - null

有谁知道 null 在 OSGi 中意味着什么以及我可以采取什么措施来解决这个问题?

感谢您的帮助。

最佳答案

ModelProcessor 类不是由 OSGi 类加载器加载的,而是由主应用程序(嵌入 OSGi 框架)的类加载器加载的。如果执行以下操作,您将看到哪个类加载器加载了该类:

System.out.println(ModelProcessor.class.getClassLoader().toString());

如果您想在 OSGi 中使用 ModelProcessor 类,您应该将其放入 bundle 中并将其安装到 OSGi 容器中。

您的下一个问题可能是:如何从 OSGi 容器中的 bundle 中的主应用程序访问类?

不尝试我不知道答案,但我有一些猜测:

  • 我猜测主项目(嵌入 OSGi 容器)的类路径中的类或接口(interface)将位于嵌入式 OSGi 容器的启动类路径中
  • 如果我的第一个猜测是正确的,您应该将一个接口(interface)放入主项目中,并将该接口(interface)的实现放入该包中。您可以在 bundle 的激活器中实例化实现并将其注册为服务
  • 在主应用程序中,您将能够通过已安装 bundle 的 bundle 上下文(或通过框架 bundle 上下文)基于接口(interface)访问已注册的服务

到目前为止,原因是这样的。现在,如果您需要该 bundle ,您可以通过框架对象获取它。框架对象本身也是一个包。它也有一个bundleContext。您可以根据位置值获取 bundle 。该位置标识每个 bundle ,并且您在安装 bundle 时就知道它的位置:)。如果您不知道位置,则必须遍历 bundle 并检查它们的符号名称。

关于java - 从 FrameworkUtil 类获取 BundleContext 后抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com