2013-03-04 77 views
5

当我刚开始在OSGi的样子,我的印象是,你可以只建立一个JAR和,只要它有一个清单文件,你可以在一个OSGi容器部署下。我想像一个经典的方式构建我的模块(maven),也许使用某种插件或类似的东西来编写清单,然后我可以让我的模块基本上是一个独立的应用程序,通过OSGi与其他模块进行通信。的OSGi模块/捆绑粒度

进一步阅读关于OSGi,我开始看到一个更低水平正在使用它的更多的例子,基本上取代依赖注入和如日志提供横切关注点服务。似乎使用诸如hibernate或其他的东西,是一个问题...(或者我只是错过了一些东西)。

至少对我而言,我并没有真正看到如此精细的模块化和整合到OSGi的水平,我宁愿有一个单独的模块,每个模块都有自己的一套技术和框架,以及可能的Web资源和持久层。这是OSGi可以实现的吗?如果是的话,你能指出我正确的方向,例子等吗?

编辑,加入我如何尝试使用OSGi的一些细节:

我只是设想有一个以上级模块的可能性,这可能有一个更higher-层级责任。

好比说议程模块。在这种情况下,我希望拥有诸如事件的持久性,添加事件,使用过滤器列出事件等等。 此议程可能有几个内部类,甚至可能需要持久层。所以我想用Guice这样的东西去DI这些类,还有一些JPA来坚持我的数据。

我能理解一些X切关注像服务器或记录可以有一个包,但数据模型是特定议程束。所以我认为我的问题到底是什么?什么是不可能在捆绑内做的?作为一种惯例,应该做什么和不应该做什么?

谢谢! 毛

回答

2

您可以使用OSGi的不强迫任何依赖基于OSGi的应用程序代码。然而,由于OSGi提供模块化,中间件(你的层)需要有一些OSGi的知识。问题是,在模块化的世界中,你想隐藏实现细节,这是完整的目的。然而,像Spring和Hibernate这样的东西倾向于认为类路径没有边界,并且它们会跑到围栏中。幸运的是,越来越多的中间件正在为此做好准备,我听说Hibernate现在已经付出了努力,并且JPA也可以在OSGi中使用。

+0

因此,如果我使用OSGi就绪框架(guice?),我可以继续使用它们在我的包内? – Mauricio 2013-03-04 16:26:06

+0

是的,这将起作用然而,我的(相当广泛的)经验是,当你编写像Spring这样的非常模块化的代码框架时,Guice等往往会失去其主要价值,因为问题变得如此之小以至于这些框架感觉相当超重。一个好的包是一致的,然后你通常不需要这些框架的开销。然而,在OSGi世界中没有任何东西禁止你加入这个重量:-) – 2013-03-04 17:42:03

1

关于使用maven构建,您可以使用Maven-Bundle-Plugin它帮助您构建OSGi包,而无需自行编写清单。所有必需的元信息将在您的POM中。

依赖注入可以在模块层的顶部来实现。一种可能的解决方案是声明式服务,它使您能够通过XML描述或代码注释进行注入。它强烈地反映了OSGi服务的动态性质(动态绑定解绑定服务)。 另一种方法是Blueprint它基于Spring并具有非常类似的语法。其中一个关键特征是它可以抽象绑定和解除绑定服务的性质。如果您考虑使用Spring,请使用蓝图。

OSGi只暗示你如何构建你的模块。你可以得到一个明确定义的模块交互图(谁导入/导出一个包?谁导出服务和谁使用它?) 因此,您可以通过为每个任务构建内聚捆绑包来构建企业体系结构。

1

OSGi有时被称为面向服务的JVM架构。将捆绑包看作提供服务的模块化单元有助于定义正确的粒度:通常会有API捆绑包,它们只是提供定义API的Java包,提供这些API实现的服务捆绑包以及提供实用程序/辅助捆绑包你提到的交叉服务。

您可以在OSGi之上使用一些依赖注入框架,但从我的经验(使用Apache Sling和Adobe CQ5)保持简单的情况往往会更好。 OSGi服务组件运行时和配置管理提供了管理服务,依赖性和配置所需的全部功能,特别是如果您从一开始就为此设计系统。

您可以在我的“OSGi战壕传说”幻灯片http://www.slideshare.net/bdelacretaz/tales-from-the-osgi-trenches-2012-short-form-edition上设计Adobe CQ5的设计经验,这可能有助于更好地感受OSGi如何用于构建复杂系统。

+0

谢谢, 我只是想象拥有一个以上的一流模块,可能有更高层次的责任。就像说议程模块一样。 在这种情况下,我想拥有诸如事件的持续性,添加事件,使用过滤器列出事件等等。 此议程可能有几个内部类,甚至可能需要持久层。所以我想用Guice这样的东西去DI这些类,还有一些JPA来坚持我的数据。 我可以理解,像服务器这样的X切割问题可以有一个包,但数据模型是特定于议程包的。 – Mauricio 2013-03-05 13:01:45

+0

请注意,您也可以在捆绑包中使用内部服务,使用的捆绑包不是从包中导出的接口,也不是捆绑包本身的实现 - 这适用于在本地更好地模块化您的议程捆绑包的“本地服务”,而仍然只使用OSGi的服务运行时。 – 2013-03-05 16:46:48

2

OSGi是很多事情很多人,你几乎可以挑选你想用什么部位的吧:

  1. 你有没有使用任何其他依赖一个普通的图书馆吗?甜心,只要提供一个最小化的MANIFEST.MF列出公共包,使用maven来构建你的JAR,就完成了。
  2. 你有依赖吗?与(1)相同,您只需在清单中添加导入的包。
  3. 你需要执行一些初始化吗?写一个Activator,并在清单中提及它。
  4. 服务?只需将它们的依赖关系和描述放在XML文件中,并将它们添加到清单中即可。

依此类推 - 只需使用舒适的水平即可。另一方面,如果你想做web应用程序,你真的需要考虑OSGi,你使用的库,你的应用程序管理器和servlet/jee /任何容器之间的架构相互作用。 OSGi居住在什么级别?一般来说,OSGi-> container-> app,container-> OSGi-> app和container-> app-> OSGi解决方案,每个都有自己的特性。