0

我正在按照本教程将 OSGi 嵌入到基于 maven 的应用程序中。我有一个类文件,可以创建并启动此处提到的框架,并且它在那里工作正常,因为我能够轻松获得 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

有谁知道 null 在这里对 OSGi 意味着什么以及我可以做些什么来解决这个问题?

谢谢您的帮助。

4

1 回答 1

1

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

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

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

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

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

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

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

于 2013-08-22T08:25:47.050 回答