gpt4 book ai didi

java - liferay osgi从另一个包加载可选类

转载 作者:行者123 更新时间:2023-12-02 02:23:54 24 4
gpt4 key购买 nike

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

  • A 可能会部署,也可能不会部署
  • B 始终部署

我需要实现:

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

我不想将bundle A作为编译依赖项放入B的build.gradle中,如果上述“仅当...”为真,我想直接加载到bundle B的类b中。

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

--

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

1- DynamicImport-Package: * 到我希望从中动态加载类的包2- ImportPackage: * 以与 1 相同的方式

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

最佳答案

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

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

关于java - liferay osgi从另一个包加载可选类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48077343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com