使用osgi开发应用程序

时间:2011-02-07 12:55:11

标签: java eclipse osgi

我正在用java开发一个基于语义的搜索应用程序。为了使应用程序模块化,我想使用osgi架构。但由于我是osgi的新手,我不知道使用它的优点和缺点。任何人都可以解释使用osgi的优点/缺点,使用osgi /应用程序将通过这样做获得什么样的应用程序将受益?

谢谢!!

5 个答案:

答案 0 :(得分:24)

简而言之,OSGi是用于构建模块化应用程序的标准。它增加了新的模块化水平 - 捆绑(又称组件,模块)。每个包都包含类和接口,它必须明确说明最重要的内容:

  • 它使用的其他组件或Java包,
  • 以及要公开的包以供其他组件使用。

从技术角度来看,bundle是jar文件,它有一些扩展META-INF/MANIFEST.MF文件。所有上述信息都存储在MANIFEST.MF文件中。

从实际的角度来看,这种显性既有优点也有缺点。对我来说,最大的优势是您不得不在标准应用程序中考虑您的体系结构,模块和它们之间的交互。这可以创建更好的架构,其中每个模块负责明确定义的任务,并且可以重用模块。如果遇到缺点,创建大量模块有时可能会很痛苦。拥有很多模块非常容易,如果你真的有很多模块,那么很难维护模块之间的所有依赖关系(依赖循环非常痛苦)。

OSGi不仅是构建模块化应用程序的标准。它还指定捆绑存在和运行的环境。这是您应该注意的事项 - 使用OSGi时,您必须在特殊环境中启动应用程序。此环境(例如Eclipse Equinox)负责运行您的应用程序。它提供了一些奇特的可能性。例如,您可以在已经运行的应用程序中添加一个包而无需停止此应用程序 - 这在某些类型的应用程序中可能是一个非常重要的元素(但是恕我直言,没有那么多应用程序真正需要这个)。

真正重要的还有一个事实,即一些开源库可能与OSGi基础架构不完全兼容,并且可能很难在标准Java应用程序中使用它们(请记住在OSGi中的所有内容)应该是一个捆绑)。但是,很多流行的库被包装成了捆绑包 - 例如Spring提供了它的bundles repository,它包含许多流行的库(但不是全部)。

OSGi非常复杂,很难用几句话来描述它及其可能性。我写的只是OSGi中最重要的(IMO)元素。但OSGI更多,例如bundle可以互相发送事件,可以互相提供服务。如果您对更多细节感兴趣,我建议您阅读教程。我可能会推荐this one in Java World。之后你可以看一下关于OSGi的this free e-book(它包含很多细节)。关于OSGi的所有细节都可以在官方规范中找到,但我不会说它们很容易阅读(至少在开头) - 你可以找到它们here(在下载之前你必须接受许可证和一些法律声明)。

总结一下,我认为OSGi在构建模块化应用程序时非常有用,但这肯定不是免费的。这是一个沉重的标准,可能会让你无法做某些事情并迫使你做 OSGi方式

一些相关的SO问题:

答案 1 :(得分:4)

我个人(2年)与OSGI的经验是技术法案的重要性超过了数量级的功能。

我遇到的情况是你必须创建/编辑25个以上的pom文件来实现一个单行模拟! 设计起着很大的作用,但我发现令人不安的是,开发人员成为主题(如maven)的专家,对客户面临的价值没有影响。
此外,这种方法不能很好地应对敏捷。事实上,它非常适合... Waterfall
这完全是关于你的主要焦点恕我直言。可交付成果与施工模式。

简而言之,OSGI不是邪恶的,但不适合小型团队和快速上市

答案 2 :(得分:2)

我个人认为OSGi带来的痛苦多于收益。如果你真的需要一个可插拔的应用程序,你可以开始使用OSGi,但是你需要以可插拔的方式编写代码,这根本不简单(即使在eclipse中安装插件时它建议重新启动eclipse,也有不知道为什么它使用OSGi)

我开发了两个项目,在工作中使用OSGi,它是在项目开始时很慢,因为你需要用大量的公共图书馆,而不是所有的人都可以换,因为你可能会遇到在运行一个ClassNotDefoundError时间因为使用代理对象时的类加载器问题。

所有这些我们都在使用OSGi的可利用来实现项目的模块化只是行家,OSGi的无人工作时强制你写了很多细粒度束的,如果你愿意,你可以写在一个大束孔应用。

如果我们谈论组件之间失去耦合,可以使用spring-core或google-guice依赖注入框架的自动连接来实现。

答案 3 :(得分:1)

您需要写一本书才能正确回答这个问题。事实上,很多书都是关于这个主题的。如果您真的想了解OSGi,我建议您搜索这样一本书。

OSGi是一个Java模块化框架。它在这个领域没有任何可信的竞争。任何应用程序都可以从更加模块化中受益,但模块化不是免费的。将所有内容都放入一个巨大的类加载器中更容易,并且不要过多考虑组件的关系。如果您决定尝试OSGi,那么Eclipse的优秀PDE工具确实支持非Eclipse目标OSGi开发,并且使用OSGi更容易。

答案 4 :(得分:0)

至少可以说,OSGI令人痛苦。 例如就导入,导出等而言,创建捆绑软件的maven-bundle-plugin并非始终都创建正确的捆绑软件。 必须手工制作这个捆绑包定义会更加乏味。 部署捆绑包后(例如在Karaf中),它将显示另一个依赖关系错误列表,所有这些依赖关系错误都需要得到解决(可能是一个接一个)