在应用程序中访问OSGI包上下文

时间:2013-11-18 11:22:19

标签: osgi osgi-bundle

我正在尝试访问java应用程序中的OSGI bundle的上下文以获取正在运行的服务。

ctx.getServiceReference(ReceiverService.class.getName());

我试过这个:

BundleContext ctx = FrameworkUtil.getBundle(ReceiverService.class).getBundleContext();

但它返回null

我在图形模式下使用预安装的bundle初始化Knopflerfish,然后启动SenderSevice包和ReceiveService包。我想访问ReceiveService以在Java应用程序中使用收到的对象。所以我需要访问ReceiveService包上下文。

2 个答案:

答案 0 :(得分:2)

您似乎正在使用嵌入在Java应用程序中的OSGi框架 - 您是如何启动该框架的?

标准方式是

Framework framework = FrameworkFactory.newFramework(props);

然后,您可以从framework实例获取系统包上下文:

BundleContext ctx = framework.getBundleContext();

在您的示例中,ReceiverService很可能是由应用程序类加载器加载而不是由bundle类加载器加载,因此FrameworkUtil无法确定加载此类的包。

答案 1 :(得分:1)

从哪里加载ReceiveService接口?它是从捆绑导出的吗?不幸的是,系统包无法从普通包中导入包。

由于您正在嵌入OSGi,并在外部应用程序和内部框架之间的服务方面进行通信,因此接口包必须由外部应用程序加载并使用org.osgi.framework.system.packages.extra属性导出。此属性通过您提供给FrameworkFactory.newFramework()的地图传递。然后普通的bundle可以导入服务接口并发布服务。

要从外部应用程序访问BundleContext,您必须使用getBundleContext()对象上的Framework方法。这将返回系统包的BundleContext