liferay osgi 从另一个包加载可选 class

liferay osgi load optional class from another bundle

我有两个 (Liferay 7) osgi 包,A 和 B

我需要达到:

仅当部署了 bundle A 时,bundle B 中的 class b 才应在 bundle A 中创建 class a 的对象。

我不想将bundle A作为编译依赖放在B的build.gradle中,我想直接加载到bundle B的class b中,如果上面的"Only if..."是是的。

我尝试过的(在捆绑包 B 中):

    try {
        @SuppressWarnings("unchecked")
        Class<SomeInterface> clazz =
            (Class<SomeInterface>) Class.forName(
                BUNDLE_A_CLASS_NAME);

        if (null != clazz &&
            Bundle.ACTIVE == FrameworkUtil.getBundle(clazz).getState()) {
            SomeInterface x = clazz.newInstance();
        }
    }
    catch (Exception e) {
        // handle this
    }

...

其中 SomeInterface x 是我在 class 路径上的接口,但 clazz.newInstance() 是包 A 中的一个实现。

--

我也试过添加到 B 的 bnd.bnd 文件

1- DynamicImport-Package: * 到我希望从中动态加载 class 的包 2- ImportPackage: * 与 1

相同

如有任何反馈或建议,我们将不胜感激。谢谢

尼尔是对的。您应该为此使用服务。在您的 bundle B(或单独的 bundle C)中创建一个接口 S,它是您的服务合同。在您的 bundle A 中实现该接口并向其注册 OSGi 服务。然后在 bundle B 的 class 中添加对 S 的可选贪婪服务引用。这样

  • B 不依赖于 A(编译时不需要 A classpth)
  • A 依赖于 B(或 C,如果您决定将 S 提取到自己的包中)
  • B 可以有或没有 A
  • 安装 A 后,它会注册 S,然后通知 B 并可以调用 S(例如获取您的对象)
  • 当 A 被卸载时,它会注销 S,然后 B 会收到通知并可以进行清理