2013-07-23 36 views
0

Im试图访问java项目中的osgi ds。我发现在互联网上像这样的例子:访问java项目中的osgi声明式服务

BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); 
ServiceReference serviceReference = context.getServiceReference(MyClass.class.getName()); 
MyClass blah = (MyClass) new ServiceTracker(context, serviceReference, null).getService(); 
blah.doStuff(); 

这里的问题是,如果我在一个Java类中运行这个“背景”变量为空。我想这可能是因为它不在一个osgi包中。

我试图chaning的东西,如果我改变它像这样它的工作原理:

BundleContext context = FrameworkUtil.getBundle(Myclass.class).getBundleContext(); 

但说实话,我真的不明白这个包上下文。 它究竟是什么,它可以与参考类是相同的类吗?

手册声明以下内容: 上下文 - 跟踪完成的BundleContext。 ......但是,这些让我更清楚。

谢谢!

回答

2

FrameworkUtil.getBundle(Class)如果传入的类是由OSGi包类加载器加载的,则只返回非null。这意味着你实际上需要在OSGi包中。

你需要更清楚你想要做什么。 “在Java项目中访问OSGi DS”几乎没有意义。另外,既然看起来你刚刚开始使用OSGi,为什么不从一个简单的东西开始,比如通过一个基本的教程进行工作,而不是在深处跳跃?

最后请注意,下面的代码片断是无稽之谈:MyClass.class.getClass()。文字MyClass.class已经为您提供了您想要的课程......如果您再拨打getClass就可以获得课程java.lang.Class!这几乎肯定不是你想要的。

+0

感谢您的回答。 MyClass.class是正确的,只是在复制时出错。我会纠正我的问题。 但问题的真正意义在于理解上下文变量是什么?它可以是同一类的背景,即时获得参考? – user1985273

+0

BundleContext是访问OSGi API的句柄。 OSGi框架为每个包提供了自己的上下文对象,该包在任何时候调用OSGi时都应该使用它。这样,OSGi总是知道哪个软件包正在调用它。 –

+0

那么,如果把手与参考相同,那么可以吗? – user1985273