Java 使用osgi开发应用程序

Java 使用osgi开发应用程序,java,eclipse,osgi,Java,Eclipse,Osgi,我正在用java开发一个基于语义的搜索应用程序。为了使应用程序模块化,我想使用osgi架构。但由于我是osgi新手,我不知道使用它的利弊。有人能解释一下使用osgi的优点/缺点吗?使用osgi会使什么样的应用程序受益?这样做会给应用程序带来什么好处 谢谢 你需要写一本书才能正确回答这个问题。事实上,很多书都是关于这个主题的。如果你真的想了解OSGi,我建议你找一本这样的书 OSGi是一个Java模块化框架。它在这一领域没有任何可信的竞争对手。任何应用程序都可以从更模块化中获益,但模块化并不是免费

我正在用java开发一个基于语义的搜索应用程序。为了使应用程序模块化,我想使用osgi架构。但由于我是osgi新手,我不知道使用它的利弊。有人能解释一下使用osgi的优点/缺点吗?使用osgi会使什么样的应用程序受益?这样做会给应用程序带来什么好处


谢谢

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


OSGi是一个Java模块化框架。它在这一领域没有任何可信的竞争对手。任何应用程序都可以从更模块化中获益,但模块化并不是免费的。将所有内容都放在一个巨大的类加载器中,并且不太仔细地考虑组件之间的关系,这会更容易。如果您确实决定尝试一下OSGi,那么作为Eclipse一部分的优秀PDE工具确实支持非针对Eclipse的OSGi开发,并使使用OSGi更加容易。

简单地说,OSGi是用于构建模块化应用程序的标准。它增加了新的模块化级别—捆绑包(也称为组件、模块)。每个捆绑包都包含类和接口,并且必须明确说明最重要的内容:

  • 它使用哪些其他组件或Java包
  • 以及它希望公开哪些包供其他组件使用
从技术角度来看,捆绑包是jar文件,它有一个稍微扩展的
META-INF/MANIFEST.MF
文件。所有上述信息都存储在
MANIFEST.MF
文件中

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

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

真正重要的是,一些开源库可能与OSGi基础设施不完全兼容,并且很难像在标准Java应用程序中那样开箱即用(请记住,在OSGi中,一切都应该是捆绑包)。然而,许多流行的库都打包成了包——例如Spring提供了its,其中包含许多流行的库(但不是全部)

OSGi相当复杂,很难用几句话来描述它及其可能性。我写的只是OSGi中最重要的(IMO)元素。但OSGI的功能远不止这些,例如捆绑包可以相互发送事件,它们可以相互提供服务。如果您对更多细节感兴趣,我建议您阅读一篇教程。我可以推荐。之后,您可以了解一下OSGi(它包含很多细节)。关于OSGi的所有详细信息都可以在官方规范中找到,但我不认为它们很容易阅读(至少在开始的时候)-你可以找到它们(下载之前,你必须接受许可证和一些法律声明)

总而言之,我认为OSGi在构建模块化应用程序时很有用,但这肯定不是免费的。这是一个相当沉重的标准,它可能不允许您做一些事情,并迫使您以OSGi的方式做这些事情

一些相关的SO问题:


我个人认为OSGi带来的痛苦大于好处。如果您真的需要一个可插入的应用程序,您可以开始使用OSGi,但您需要以可插入的方式编写代码,这一点并不简单(即使在eclipse中安装插件时,它建议重新启动eclipse,但不知道它为什么要使用OSGi)

我在工作中使用OSGi开发了两个项目,在项目开始时速度非常慢,因为您需要包装许多公共库,而不是所有的库都可以包装,因为您可能会在运行时遇到ClassNotDefoundError,因为在使用代理对象时会遇到classloader问题

我们在使用OSGi的项目中拥有的所有模块化都可以使用maven实现,当使用OSGi时,没有人强制您编写许多细粒度的包,如果您愿意,您可以在一个大包中编写hole应用程序

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

我个人(2年)在OSGI方面的经验是,技术费用在数量级上超过了功能好处。

我遇到过这样的情况:您必须创建/编辑25+个pom文件来实现一行模拟
设计起到了很大的作用,但我发现开发人员成为对面向客户的价值没有影响的主题(如maven)方面的专家令人不安。
此外,这种方法不能很好地处理敏捷。事实上,它非常适合
信息技术