使用 osgi 开发应用程序
我正在Java中开发一个基于语义的搜索应用程序。为了使应用程序模块化,我想使用osgi架构。但是由于我是osgi的新手,我不知道使用它的利弊。任何人都可以解释使用osgi的优点/缺点,以及使用osgi将使什么样的应用程序受益/这样做应用程序将获得什么?
谢谢!!
我正在Java中开发一个基于语义的搜索应用程序。为了使应用程序模块化,我想使用osgi架构。但是由于我是osgi的新手,我不知道使用它的利弊。任何人都可以解释使用osgi的优点/缺点,以及使用osgi将使什么样的应用程序受益/这样做应用程序将获得什么?
谢谢!!
简而言之,OSGi是用于构建模块化应用程序的标准。它增加了新的模块化水平 - 捆绑包(又名组件,模块)。每个捆绑包都包含类和接口,以及它必须显式声明的最重要内容:
从技术角度来看,捆绑包是具有位扩展文件的jar文件。所有上述信息都存储在文件中。META-INF/MANIFEST.MF
MANIFEST.MF
从实际的角度来看,这种明确性既有优点也有缺点。对我来说,最大的优势是,与标准应用程序相比,您被迫更多地考虑您的架构,模块以及它们之间的交互。这可以创建更好的体系结构,其中每个模块负责明确定义的任务,并且可以重用模块。如果遇到缺点,创建大量模块有时可能会很痛苦。拥有很多模块是很容易的,如果你真的有很多模块,可能很难保持模块之间的所有依赖关系(依赖周期非常痛苦)。
OSGi不仅是构建模块化应用程序的标准。它还指定分发包存在和运行的环境。这是您应该注意的 - 使用OSGi时,您必须在特殊环境中启动应用程序。此环境(例如 Eclipse Equinox)负责运行您的应用程序。它提供了一些奇特的可能性。例如,您可以向已经运行的应用程序添加捆绑包,而无需停止此应用程序 - 这可能是某些类型的应用程序中非常重要的元素(但恕我直言,没有那么多应用程序真正需要它)。
真正真正重要的是,一些开源库可能与OSGi基础架构不完全兼容,并且可能很难像在标准Java应用程序中那样开箱即用地使用它们(请记住,在OSGi中,所有内容都应该是捆绑包)。但是,许多流行的库被包装成捆绑包 - 例如Spring提供了其捆绑包存储库,其中包含许多流行的库(但不是全部)。
OSGi非常复杂,很难用几句话来描述它及其可能性。我所写的只是OSGi最重要的(IMO)元素。但是OSGI要多得多,例如,捆绑包可以相互发送事件,它们可以相互提供服务。如果您对更多细节感兴趣,我建议您学习教程。我可能会在Java世界中推荐这个。之后,您可以查看这本关于OSGi的免费电子书(它包含了很多细节)。关于OSGi的所有细节都可以在官方规范中找到,但我不会说它们很容易阅读(至少在开始时) - 你可以在这里找到它们(在下载之前,你将不得不接受许可证和一些法律声明)。
总而言之,我认为OSGi在构建模块化应用程序时很有用,但这肯定不是免费的。这是一个沉重的标准,可能会禁止你做一些事情,并迫使你以OSGi的方式做事。
一些相关的 SO 问题:
我个人(2年)的OSGI经验是,技术账单比功能优势高出几个数量级。
我遇到过这样的情况,您必须创建/编辑25多个pom文件才能实现一个衬里模拟!
设计起着很大的作用,但我发现开发人员成为主题(如maven)的专家是令人不安的,这些主题对面向客户的价值没有影响。
此外,这种方法不能很好地应对敏捷。实际上,这将是一个非常适合...瀑布
恕我直言,这都是关于你的主要关注点。可交付成果与施工模式。
简而言之,OSGI不是邪恶的,但它不是小团队和快速上市的最佳选择。