CDI+OSGI:捆绑包范围

CDI+OSGI: bundle packages scope

我使用 javase 和解决方案 osgi (felix)+cdi(weld)+paxcdi。我有两个 bundle A 和 B。Bundle B 是一个 lib bundle。

在捆绑包 A 中,我有一个 class 和一个包裹。

package com.example.firstpackage;
import com.example.secondpackage.Class2;
public class Class1{
   @Inject
   private Class2 class2;
}

在捆绑包 B 中,我有两个 classes 和两个包

package com.example.secondpackage;
import com.example.thirdpackage.Class3;
public class Class2{
   @Inject
   private Class3 class3;
}

package com.example.thirdpackage;
public class Class3{
   ....
}

我安装并启动了两个包。

问题 - 注入包 A 的 classes 中的 pax(或焊接)仅扫描那些为 classes IN 包 A 导入的包。在我的示例中 - CDI 对于在 Class1 中注入,Class2 将扫描包 B 的 com.example.secondpackage。但是,它会抛出异常,因为 Class2 需要 Class3,但未扫描包 A 的 com.example.thirdpackage(因为它未导入!!!)。 com.example.thirdpackage 仅针对 bundle B 进行扫描,但据我了解,cdi 的每个 bundle 都有其自己的范围。如何解决?

如果您不更改系统设计,您所能做的就是将 thirdpackageB 导出并导入到 A

为了实现更好的封装,您可以分解出由 Class2 实现的服务接口 IClass2,将此 class 设为 @OsgiServiceProvider 并使用

@Inject @OsgiService
private IClass2 class2;

Class1.