我应该更喜欢动态导入而不是需求包吗?



我应该选择Dynamic-Import而不是Require-Bundle吗?情况是我的OSGi包在Java代码中导入了net.sf.ehcache包类,并且使用配置文件引用了很少的其他类。在我注意到错误/异常后,我通过从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 Package提供了最灵活、最不容易出错的模型。

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

OSGi使用Require-Bundle的原因是Eclipse坚持使用它,因为它类似于2005年已有的模块化解决方案。Require-Bundle从所需的bundle中导入导出的包。尽管这是一个广泛传播的模型,但问题是它对所需模型的更改非常敏感。如果要重构任何东西,您需要做大量的工作。包导入/导出提供了更松散的耦合。特别是如果你确保那些导出的包只有包含API。

如果动态导入解决了您的问题,那么您最好不要使用OSGi,因为它将模块化置于总线之下。你为框架和bundle支付了所有的钱然后你基本上做了类路径的事情:取第一个看起来像你要找的东西。OSGi的大部分好处会像雪一样消失在太阳面前。

最新更新