我按照本教程将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在这里意味着什么,以及我可以采取什么措施解决这个问题?
谢谢您的帮助。
最佳答案
ModelProcessor类不是由OSGi类加载器加载的,而是由主应用程序(嵌入OSGi框架)的类加载器加载的。如果执行以下操作,您将看到哪个类加载器加载了该类:
System.out.println(ModelProcessor.class.getClassLoader().toString());
如果要在OSGi中使用ModelProcessor类,则应将其放入包中并将其安装到OSGi容器中。
您的下一个问题可能是:如何从主应用程序访问OSGi容器中捆绑在一起的类?
我不尝试就不知道答案,但我有一些猜测:
我猜主项目(嵌入OSGi容器)的类路径中的类或接口将位于嵌入式OSGi容器的启动类路径中
如果我的第一个猜测是正确的,则应将接口引入主项目,并将该接口的实现引入捆绑包。您可以在捆绑软件的激活器中实例化实现并将其注册为服务
在主应用程序中,您将能够通过安装包的包上下文(或通过框架包上下文)基于接口访问注册的服务。
这样直到现在为止。现在,如果您需要该捆绑包,则可以通过框架对象获取它。框架对象本身也是一个包。它还具有bundleContext。您可以根据位置值获取捆绑包。该位置标识了每个捆绑软件,并且您在安装捆绑软件时便知道其位置:)。如果您不知道位置,则必须遍历这些包并检查其符号名称。