我面临的问题是,应用程序正在由第三方维护的OSGi容器上部署。
我的捆绑包中有一些功能可以导入外部包,这些包可能可用,也可能不可用。对于捆绑包不可用的情况,我的捆绑包中存在客户端捆绑包(以帮助避免ClassNotFound异常)。在另一种情况下,当捆绑存在时,应该导入包。
这有可能吗?
提前致谢。
答案 0 :(得分:5)
让我看看我是否正确理解了这个问题:假设我们正在谈论一些包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)都会为您实际执行此操作。如果您手工编写清单,则应该查看这些清单以使您的生活更轻松。
答案 1 :(得分:1)
在我看来,这是不可能的。您只能选择一种解决方案:
您将外部软件包添加到您的软件包中(这不是OSGi方式)。但是你的捆绑包运行在每个OSGi容器(框架)上。
您必须确保在OSGi容器(框架)上安装了包含所需软件包的软件包。通常必须在清单文件中输入捆绑包的依赖关系,而不是依赖必须。
你必须决定!