从FrameworkUtil类获取BundleContext后抛出NPE

时间:2013-08-22 06:28:18

标签: java osgi apache-felix osgi-bundle

我正在按照本教程将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所以我想我可以使用这段代码来获取BundleContext`

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

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

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

所以上面的行打印 - null

有没有人知道在OSGi方面null意味着什么以及我可以做些什么来解决这个问题?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

如果要在OSGi中使用ModelProcessor类,则应将其放入一个包中并将其安装到OSGi容器中。

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

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

  • 我猜主体项目(嵌入OSGi容器)的类路径中的类或接口将位于嵌入式OSGi容器的引导类路径中
  • 如果我的第一个猜测是真的,你应该在主项目中使用一个接口,并将该接口的实现带入该bundle。您可以在bundle的Activator中实例化实现并将其注册为服务
  • 在主应用程序中,您将能够通过已安装捆绑包的捆绑上下文(或通过框架捆绑上下文)基于接口访问已注册的服务。

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