OSGI:只有在外部存在时才可以导入包,否则使用本地精简版?

标签 osgi

我面临的问题是应用程序部署在由第三方维护的 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,您将连接到该现有包,并且您自己的导出现在将被“忽略”,并且
  • 如果您是唯一一个导出它的人,您将与自己建立联系。

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

简而言之,您不必太担心这种情况,通常总是导入您导出的内容。大多数工具( bndApache Felix maven-bundle-plugin )实际上会为你做这件事。如果您手写 list ,您应该研究这些内容以使您的生活更轻松。

关于OSGI:只有在外部存在时才可以导入包,否则使用本地精简版?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818967/

相关文章:

java - 嵌入 OSGi 框架 : when does bundle resolution should be done?

java - 动态加载osgi包中的类

java - karaf-maven-插件 : Defining a dependency as a feature

eclipse - 如何在 OSGi/Equinox/Eclipse 中附加库包的源代码?

java - Hibernate 5 + Spring + JDBC 瘦客户端 UCP 接口(interface)对类加载器不可见

java - 声明式服务组件满意和不满意

java - 是否有 OSGi 版本的 Guava 源代码(用于 Eclipse)?

java - Arquillian+OSGi+测试不同的框架属性

java - 配置Equinox修改 "local bundle cache"的管理

java - (OSGi) 如何导出包以供我的 bundle 导入?