liferay osgi从另一个包

时间:2018-01-03 12:23:26

标签: java liferay osgi classloader

我有两个(Liferay 7)osgi捆绑包,A和B这样

  • 可以部署或不部署
  • B始终部署

我需要实现:

仅当部署了捆绑包A时,捆绑包B中的类b应该在捆绑包A中创建类a的对象。

我不想在B&#39的build.gradle中将bundle A作为编译依赖项,我想直接在bundle B的b类中加载如果上面的"只有...&... #34;是的。

我尝试过(在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是我在类路径上的接口,但clazz.newInstance()是bundle A中的一个实现。

-

我还尝试添加到B&#39的bnd.bnd文件

1- DynamicImport-Package: *到我希望动态加载类的bundle 2- ImportPackage: *的方式与1

相同

非常感谢任何反馈或建议。感谢。

1 个答案:

答案 0 :(得分:2)

尼尔是对的。你应该使用服务。在您的捆绑包B中(或在单独的捆绑包C中)创建一个作为服务合同的接口S.在您的捆绑包中用它来连接和注册OSGi服务的工具。然后在你的B类包中添加对S的可选贪婪服务引用。这样

  • B不依赖于A(在编译classpth中不需要A)
  • A取决于B(如果您决定将S提取到自己的捆绑中,则取决于C)
  • B可以在有或没有A
  • 的情况下开始
  • 当安装A时,它会注册S然后通知B并且可以调用S(例如获取对象)
  • 当卸载A时,它会取消注册S,然后通知B并且可以清理