5

当我第一次开始研究 OSGi 时,我的印象是你可以只构建一个 JAR,只要它有一个清单文件,你就可以将它部署在一个 OSGi 容器中。我想象以经典方式(maven)构建我的模块,并且可能使用一些插件或类似的东西来编写清单,然后我可以让我的模块基本上是一个独立的应用程序,通过 OSGi 与其他模块通信。

进一步阅读有关 OSGi 的信息,我开始看到更多在更底层使用它的示例,它基本上取代了依赖注入并提供了横切关注点服务,如日志记录。并且似乎使用休眠或其他东西是一个问题......(或者我可能只是错过了一些东西)。

至少对我来说,我并没有真正看到拥有如此高水平的模块化和与 OSGi 集成的意义,我更愿意拥有一个单独的模块,每个模块都有自己的一套技术和框架,可能还有一个 Web 资源和持久层。这可以通过 OSGi 实现吗?如果是的话,你能指出我正确的方向,例子等吗?

编辑,添加了一些关于我如何尝试使用 OSGi 的更多细节:

我只是在设想拥有一个以上模块的可能性,它可能具有更高级别的责任。

比如议程模块。在这种情况下,我想要事件的持久性、添加事件、使用过滤器列出事件等......这个议程可能有几个内部类,甚至可能需要一个持久层。所以我想使用 Guice 之类的东西来 DI 这些类,并使用一些 JPA 来保存我的数据。

我可以理解,服务器或日志记录等一些 X-cutting 问题可以有一个包,但数据模型是特定于议程包的。所以我认为我的问题最后是什么是捆绑包内不可能做什么?作为一般做法,应该和不应该在内部做什么?

谢谢!毛里西奥

4

4 回答 4

2

OSGi 对很多人来说是很多东西,您几乎可以选择要使用它的哪些部分:

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

依此类推 - 只需使用您感到舒适的级别即可。

另一方面,如果你想做 Web 应用程序,你真的需要考虑 OSGi、你使用的库、你的应用程序管理器和 servlet/jee/whatever 容器之间的架构相互作用。OSGi 将驻留在什么级别?一般来说,有 OSGi->container->app、container->OSGi->app 和 container->app->OSGi 解决方案,各有各的特点。

于 2013-03-05T09:14:37.737 回答
2

您可以使用 OSGi,而无需在应用程序代码上强制依赖于 OSGi。然而,由于 OSGi 提供了模块化,中间件(你的层)需要有一些 OSGi 的知识。问题在于,在模块化世界中,您想要隐藏实现细节,这就是全部目的。然而,像 Spring 和 Hibernate 这样的东西倾向于假设类路径没有边界,并且它们会直接进入栅栏。幸运的是,越来越多的中间件正在为此做好准备,我听说 Hibernate 现在正在努力,JPA 也可以在 OSGi 中使用。

于 2013-03-04T15:55:44.363 回答
1

OSGi 有时被称为 JVM 的面向服务的体系结构。将包视为提供服务的模块化单元有助于定义正确的粒度:您通常会拥有 API 包,它们只是在这里提供定义 API 的 java 包、提供这些 API 实现的服务包,以及提供这些 API 的实用程序/辅助包您提到的跨领域服务。

您可以在 OSGi 之上使用一些依赖注入框架,但根据我的经验(使用 Apache Sling 和 Adob​​e CQ5),保持简单通常会更好。OSGi 服务组件运行时和配置管理提供了我管理服务、依赖项和配置所需的一切,特别是如果您从一开始就为此设计系统。

您可以在我的“来自 OSGi 战壕的故事”幻灯片中找到更多关于我们使用 OSGi 设计 Adob​​e CQ5 的经验,网址为http://www.slideshare.net/bdelacretaz/tales-from-the-osgi-trenches-2012-简短版- 这可能有助于更好地了解 OSGi 如何用于构建复杂系统。

于 2013-03-05T08:44:46.283 回答
1

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

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

OSGi 仅暗示您如何构建模块。您会得到一个定义明确的模块交互图(谁导入/导出包?谁导出服务以及谁使用它?)因此,您可以通过为每个任务构建有凝聚力的捆绑包来在其之上构建企业架构。

于 2013-03-05T07:58:41.687 回答