OSGI:只有在外部存在时才能导入捆绑,否则使用本地缩减版本?

时间:2011-01-27 16:26:52

标签: osgi

我面临的问题是,应用程序正在由第三方维护的OSGi容器上部署。

我的捆绑包中有一些功能可以导入外部包,这些包可能可用,也可能不可用。对于捆绑包不可用的情况,我的捆绑包中存在客户端捆绑包(以帮助避免ClassNotFound异常)。在另一种情况下,当捆绑存在时,应该导入包。

这有可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

情况

让我看看我是否正确理解了这个问题:假设我们正在谈论一些包foo。如果您环境中有人导出此包,则您希望完全导入该包。

[someone-else] --exp--> foo <--imp-- [you]

如果没有人导出软件包,你可以自己复制它,你所谓的“客户端软件包”;我真的不明白你的意思,但我想这意味着你想有条件地导出一些包,所以我们最终会遇到这种情况

[you] --exp--> foo
   |            ^
   |            |
   -----imp------

所以,你接触到了自己。

我还认为您已尝试自行导出foo包,但在查找时,您无法使用foo包中的类与其他包进行通信。

解决方案

如果上述情况正确,您可以使用默认的OSGi行为。您声明两者导出并导入包

Export-Package: foo
Import-Package: foo

您现在总是导出包,但OSGi解析机制将确保正确连接:

  • 如果有人已经导出foo,您将连接到现有的套餐,并且您现在将“忽略”您自己的导出,并且
  • 如果你是唯一一个出口它的人,你就可以自己连接。

在这两种情况下,您都会连接到其他人正在使用的相同软件包,这正是您所需要的。

简而言之,您不应过分担心这种情况,并且通常始终导入您导出的内容。大多数工具(bndApache Felix maven-bundle-plugin)都会为您实际执行此操作。如果您手工编写清单,则应该查看这些清单以使您的生活更轻松。

答案 1 :(得分:1)

在我看来,这是不可能的。您只能选择一种解决方案:

  1. 您将外部软件包添加到您的软件包中(这不是OSGi方式)。但是你的捆绑包运行在每个OSGi容器(框架)上。

  2. 您必须确保在OSGi容器(框架)上安装了包含所需软件包的软件包。通常必须在清单文件中输入捆绑包的依赖关系,而不是依赖必须

  3. 你必须决定!