liferay osgi 从另一个包加载可选 class
liferay osgi load optional class from another bundle
我有两个 (Liferay 7) osgi 包,A 和 B
- 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 会收到通知并可以进行清理
我有两个 (Liferay 7) osgi 包,A 和 B
- 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 会收到通知并可以进行清理