我应该更喜欢 Dynamic-Import 而不是 Require-Bundle?

Should I prefer Dynamic-Import over Require-Bundle?

我应该更喜欢 Dynamic-Import 而不是 Require-Bundle? 情况是我的 OSGi 包在 Java 代码 net.sf.ehcache 包 [=21] 中导入=] 并引用其他一些 类 使用配置文件。在我注意到 errors/exceptions 之后,我通过将 Import-Package: net.sf.ehcache 更改为 Require-Bundle: net.sf.ehcache 来解决缺少 类 的问题。但我想知道除了 Import-Package: net.sf.ehcache?

之外我是否应该添加 Dynamic-Import: net.sf.ehcache.*

OSGi 被设计为使用 Import-Package。如果您在使用 Import-Package 时遇到问题,那么您或您使用的包可能会遇到更深层次的模块化问题。 Import/Export 包提供了最灵活、最不容易出错的模型。

我建议的第一件事是使用 bnd 来诊断您的设置有什么问题,听起来您是在手动编写清单?如果是这样的话,我可以向你保证,你的未来会有很多问题。使用 bnd(我最喜欢的是工作区模型,但您可以在 Gradle、Maven 和命令行中使用它)将使 OSGi 使用起来轻而易举。运行时的问题你应该不用找,bnd应该提前给你指出来。

OSGi 拥有 Require-Bundle 的原因是 Eclipse 遗憾地坚持使用它,因为它类似于 2005 年现有的模块化解决方案。Require-Bundle 从所需的包中导入导出的包。虽然这是一个广泛传播的模型,但问题是它对所需模型的变化非常敏感。如果要重构任何东西,您需要做很多工作。包 imports/exports 提供了更松散的耦合。特别是如果您确保那些导出的包 包含 API.

如果动态导入解决了您的问题,您最好不要使用 OSGi,因为它会在总线下抛出模块化。你为框架和捆绑支付了所有的钱,然后你基本上做了 class 路径的事情:拿第一个看起来像你正在寻找的东西。 OSGi 的大部分好处将像雪一样消失在阳光下。