我面临的问题是应用程序部署在由第三方维护的 OSGi 容器上。
我的包中有一些功能可以导入外部包,这些包可能可用也可能不可用。对于 bundle 不可用的情况,我的 bundle 中存在一个客户端 bundle (以帮助避免 ClassNotFound 异常)。在另一种情况下,当包存在时,应该导入包。
这有可能吗?
提前致谢。
最佳答案
情况
让我看看我是否正确理解了这个问题:假设我们正在谈论一些包 foo
。如果您环境中的某个人导出了这个包,您希望完全导入那个包。
[someone-else] --exp--> foo <--imp-- [you]
如果没有人导出包,你自己有一个副本,在你所谓的“客户端包”中;我不太明白你的意思,但我想这意味着你想有条件地导出一些包,所以我们最终会遇到这种情况
[you] --exp--> foo
| ^
| |
-----imp------
所以,你会与自己建立联系。
我还得知您曾尝试自己导出 foo
包,但发现当您这样做时,您无法使用 foo
包中的类与其他包通信.
解决方案
如果上述情况正确,您可以使用默认的 OSGi 行为。您声明您同时导出和导入一个包,
Export-Package: foo
Import-Package: foo
您现在总是导出包,但 OSGi 解析机制将确保正确连接:
- 如果有人已经导出了
foo
,您将连接到该现有包,并且您自己的导出现在将被“忽略”,并且 - 如果您是唯一一个导出它的人,您将与自己建立联系。
在这两种情况下,您都连接到其他人都在使用的同一个包,这正是您所需要的。
简而言之,您不必太担心这种情况,通常总是导入您导出的内容。大多数工具( bnd , Apache Felix maven-bundle-plugin )实际上会为你做这件事。如果您手写 list ,您应该研究这些内容以使您的生活更轻松。
关于OSGI:只有在外部存在时才可以导入包,否则使用本地精简版?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818967/