我正在尝试访问java应用程序中的OSGI bundle的上下文以获取正在运行的服务。
ctx.getServiceReference(ReceiverService.class.getName());
我试过这个:
BundleContext ctx = FrameworkUtil.getBundle(ReceiverService.class).getBundleContext();
但它返回null
我在图形模式下使用预安装的bundle初始化Knopflerfish,然后启动SenderSevice包和ReceiveService包。我想访问ReceiveService以在Java应用程序中使用收到的对象。所以我需要访问ReceiveService包上下文。
答案 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
。