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

hee*_*oir 1 osgi

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

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

这有可能吗?

提前致谢.

Ang*_*jpt 5

情况

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

[someone-else] --exp--> foo <--imp-- [you]
Run Code Online (Sandbox Code Playgroud)

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

[you] --exp--> foo
   |            ^
   |            |
   -----imp------
Run Code Online (Sandbox Code Playgroud)

所以,你接通了自己.

我还认为你已经尝试foo自己导出包,但是当你这样做时,你无法使用包中的类与其他包进行通信foo.

如果上述情况正确,则可以使用默认的OSGi行为.您声明导出和导入一个包,

Export-Package: foo
Import-Package: foo
Run Code Online (Sandbox Code Playgroud)

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

  • 如果某人已经导出foo,您将连接到现有的包,并且您现在将"忽略"您自己的导出,并且
  • 如果你是唯一一个出口它的人,你将自己连接到自己.

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

简而言之,您不应该过多地担心这种情况,并且通常总是导入您导出的内容.大多数工具(bnd,Apache Felix maven-bundle-plugin)实际上都会为你做这件事.如果你手工编写清单,你应该研究这些以使你的生活更轻松.