首页 > 解决方案 > 在 2 个插件 Eclipse rcp 之间动态共享数据

问题描述

假设 eclipse rcp 应用程序中有两个插件 P1 和 P2 可用。

P1 和 P2 都是由不同的构建过程分别构建的

在我的场景中,根据用户的选择,基础产品中只有 p1、p2 或两个插件可用。

当两个插件都可用时,我想在插件 P1 和 P2 之间交换数据,否则插件将使用它们自己的数据。

OSGI 声明式服务在我的场景中能否正常工作?

有什么方法可以公开从插件 P1 返回 json 或字符串的服务 api,而 P2 可以在不依赖它的情况下使用它,我的意思是,插件 p2 应该只在 p1 存在时使用它,如果不存在,它应该作为普通的。

好心劝告。

编辑:谢谢你的建议

我完全同意拥有一个通用插件将是理想的。

但是在我们的例子中,我们有一个基础产品,不幸的是我们无法控制,我的意思是我们可以将任何插件添加到基础存储库。

插件 P1 和 P2 是 2 个不同的产品,它们彼此独立工作,但具有可以相互补充的数据。我们喜欢从插件 p2 进行 api 调用,如果插件 p1 安装在基础产品上并使用数据来增强 p2 中的现有视图,否则仅显示 p2 数据。

我假设,使用 declerative 服务,插件 P2 可以使用 osgi 规范 api 调用插件 P1 公开的 api,这些 api 是 eclipse 标准插件的一部分,而不会在插件 P1 和 P2 之间添加任何依赖关系。请让我知道是否有任何选项可以实现这一目标。

标签: eclipseeclipse-pluginosgircpdeclarative-services

解决方案


当然,您可以有可选的依赖项——但我的建议是引入 P3,以保留公共数据。使 P1 和 P2 依赖于该插件,并无条件地从通用“存储”插件中检索数据。

如果您使 P1 依赖于 P2(反之亦然),则需要将此依赖项设为可选,并且您将引入两者的循环编译时依赖项。解决这种循环的一个好方法是引入一个通用的第三个模块,它只是实现了共同的需求。

编辑:回答您的评论 - 如果您让 P1 注册 P2 引用的服务,那么 P2 将依赖于 P1 的服务接口,除非您从公共 P3 注册一个两者都依赖的类。话虽如此,没有什么可以阻止您将任意 JRE 类注册为服务 - 这将是非常规且奇怪的 hack,但我想您可以将 HashMap 注册为服务。感觉不干净、有异味、很老套、很奇怪——你的代码的维护者可能会困扰你,但我想从技术上来说这是可能的。我是否说过我不建议这样做并且它很丑陋?


推荐阅读