我按照本教程将OSGi嵌入到基于maven的应用程序中。我有一个类文件,创建并启动框架,如here所述,它可以很好地工作,因为我可以轻松获取BundleContext。从FrameworkUtil类获取BundleContext后抛出NPE
我在我的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
,然后我试着打印出来,看看有什么happening-
System.out.println(FrameworkUtil.getBundle(ModelProcessor.class));
所以上面的线prints- null
没有人有任何想法是什么呢null表示在这里的OSGi的条款和我能做些什么来解决这个问题?
感谢您的帮助。
我很迷惑。我在我的主应用程序中启动了osgi框架,因此我假定该项目中的所有类都应该由OSGi classloader加载?对?如果是,那么为什么它没有被OSGi classloader加载?如果没有,那么我怎样才能确保该主项目中的所有类都能被OSGi classloader加载? – ferhan
一旦JVM启动并且它有一个类加载器。之后,你的应用程序启动,并有一个类加载器。 JVM是您的应用类加载器的父代。如果搜索到一个类,它将在当前类加载器中首先搜索,而不是在父类中搜索。现在,如果你启动一个OSGi容器,它将打开几个类加载器,但在容器内部。我猜你的主应用程序的类加载器将是OSGi引导类加载器的父类。因此,如果您直接在主应用程序中使用某个类,则可以确定它不来自OSGi。 –
OSGi与JEE服务器等较旧的解决方案不同,类加载器不在树中,而在图中。如果你在纸上绘图,你可以画一个树,直到你的主应用程序(JVM - app)和应用程序下你可以绘制一个图(OSGi包)。您只能通过捆绑线走到OSGi容器的上方或内部。 –