【问题标题】:Accessing an osgi declarative service in a java project在 Java 项目中访问 osgi 声明式服务
【发布时间】:2013-07-23 20:18:20
【问题描述】:

我正在尝试访问 java 项目中的 osgi ds。我在网上找到了这样一个例子:

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 类中运行它,“context”变量为空。我想那可能是因为它不在 osgi 包中。

我试过改变东西,如果我这样改变它就可以了:

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

但老实说,我真的不明白这个捆绑包的上下文。 它到底是什么,它可以和引用类是同一个类吗?

手册规定如下: context - 完成跟踪的 BundleContext。 ...但这并没有让我更清楚。

谢谢!

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    FrameworkUtil.getBundle(Class) 仅在您传入的类由 OSGi 捆绑类加载器加载时才返回非 null。这意味着您实际上需要在一个 OSGi 包中。

    您需要更清楚自己想要做什么。 “在 Java 项目中访问 OSGi DS”几乎毫无意义。此外,既然您似乎刚刚开始使用 OSGi,为什么不从一些简单的事情开始,例如完成基本教程,而不是深入研究?

    最后注意到下面的sn-p代码是废话:MyClass.class.getClass()。文字MyClass.class 已经为您提供了您想要的课程......如果您随后调用getClass,您将获得java.lang.Class 的课程!这几乎肯定不是您想要的。

    【讨论】:

    • 感谢您的回答。 MyClass.class 是正确的,只是在复制时出错。我会纠正我的问题。但问题的真正意义在于理解上下文变量是什么?可以是我获得参考的同一类的上下文吗?
    • BundleContext 是访问 OSGi API 的句柄。 OSGi 框架为每个包提供了它自己的上下文对象,该包应该在它调用 OSGi 的任何时候使用。这样,OSGi 总是知道哪个包在调用它。
    • 那么手柄和reference一样可以吗?
    • 我不明白你在问什么。 BundleContext 和 ServiceReference 是不同的类型,所以它们显然不一样。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2015-12-23
    • 2015-11-13
    • 2013-10-09
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多