OSGi + 焊接:FrameworkUtil getBundleContext() returns 空

OSGi + Weld: FrameworkUtil getBundleContext() returns null

我使用 Apache Felix 和 weld,我有两个 classes:

@ApplicationScoped
class A {
  private B b= new B();
}

class B {
  private void foo(){
    BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext();
  }
}

对象是 class A 是由 CDI 容器创建的,我认为这就是 class B FrameworkUtil.getBundle returns 为空的原因。也许 classloader 问题或类似的问题。当然,当 Weld 注入它时,我可以从 A class 获取对捆绑上下文的引用。但我不想将此引用保留在 A 中并将其传递给任何其他 classes。我可以在 B 中获取对 bundle context 的引用(而不是从 A 中获取)吗?我试过 B:

@Inject
BundleContext bundleContext;

但是没有用。这可能很重要 - 这些 class 位于不同的包中。

可能对象实例具有 CDI 容器在运行时通过其自己的自定义类加载器(通过创建 A 的子类)创建的类型。

而不是调用

BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext();

试着打电话

BundleContext bc= FrameworkUtil.getBundle(A.class).getBundleContext();

如果类型 A 由包的 ClassLoader 加载,这应该有效。

顺便说一句:我建议不要在 OSGi 中使用 Weld、CDI 和其他技术。它们可能是集成的,但由于在应用程序服务器(只有一个类加载器/应用程序)中工作的技巧,它们通常会造成很多痛苦。