我正在按照本教程将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意味着什么以及我可以做些什么来解决这个问题?
感谢您的帮助。
答案 0 :(得分:1)
ModelProcessor类不是由OSGi类加载器加载,而是由主应用程序的类加载器加载(嵌入OSGi框架)。如果您执行以下操作,您将看到哪个类加载器加载了该类:
System.out.println(ModelProcessor.class.getClassLoader().toString());
如果要在OSGi中使用ModelProcessor类,则应将其放入一个包中并将其安装到OSGi容器中。
您的下一个问题可能是:如何从主应用程序访问OSGi容器中的bundle中的类?
如果不尝试,我不知道答案,但我有一些猜测:
直到现在这个原因。现在,如果您需要该捆绑包,您可以通过框架对象获取它。框架对象本身也是一个包。它还有一个bundleContext。您可以根据位置值获取捆绑包。该位置标识每个捆绑包,并在您安装捆绑包时知道捆绑包的位置:)。如果您不知道位置,则必须遍历包并检查其符号名称。