OSGI入门最好的方法是什么?

什么使模块/服务/应用程序function成为OSGi模块的特别好select?

我有兴趣在我的应用程序中使用OSGi 。 我们是一个Java商店,我们广泛使用Spring,所以我倾向于使用OSGi(tm)服务平台的Springdynamic模块 。 我正在寻找一种将OSGi稍微join到应用程序中的好方法。 有没有人在这里使用过这个或类似的OSGi技术? 有什么陷阱吗?

@尼古拉斯 – 谢谢,我已经看到了一个。 这是一个很好的教程,但我正在寻找更多关于如何做我的第一个“真正的”OSGi包,而不是一个Hello World示例的想法。

@david – 感谢您的链接! 理想的情况是,在一个绿色的应用程序,我会devise整个事情是dynamic的。 但是,我现在要找的是将其引入现有应用程序的一小部分。 假设我可以select任何应用程序,有什么因素可以使OSGi豚鼠变得更好或更糟?

那么,既然你不能有一个部分OSGi和一个部分非OSGi,你需要使你的整个应用程序OSGi。 以最简单的forms,您可以在整个应用程序中创build一个OSGi包。 显然,这不是一个好的做法,但是在OSGi容器(Equinox,Felix,Knoplerfish等)中感觉部署一个bundle会很有用。

为了把它提升到一个新的水平,你需要开始将你的应用程序分解成组件,组件通常应该有一组职责,通过一组接口和类依赖关系,它们可以与应用程序的其余部分隔离。 单纯用手来识别这些内容的范围可以从devise良好的高度内聚但松散耦合的应用程序的相当简单,到您不熟悉的互锁源代码的噩梦。

一些帮助可以来自像JDepend这样的工具,它可以显示Java包与系统中其他包/类的耦合。 具有低传出耦合的包装应该比具有高传出耦合的包装更易于被提取到OSGi束中。 更多的架构洞察力可以通过像结构101这样的专业工具来实现。

纯粹在技术层面上,每天使用包含160个OSGi包的应用程序,并使用Spring DM,我可以确认从“正常”的Spring到Spring DM的转换大部分是无痛苦的。 额外的命名空间以及你可以(也应该)将你的OSGi特定的Springconfiguration分离到不同文件中的事实使得使用和不使用OSGi部署场景变得更加容易。

OSGi是一个深度和广泛的组件模型,我build议的文档:

  • OSGi R4规范 :获取核心和纲要规范的PDF文件,它们是规范的,权威的和非常可读的。 随时都有捷径给他们,你会咨询他们的。
  • 阅读OSGi的最佳实践,你可以做的事情有很多,但是你应该做的事情要小一些,而且有一些你永远不应该做的事情 (例如DynamicImport:*)。

一些链接:

  • OSGi最佳实践和使用Apache Felix
  • Peter Kriens和BJ Hargrave在OSGi最佳实践的Sun介绍中
  • 一个关键的OSGi概念是服务,了解为什么以及如何用白板模式取代Listener 模式
  • Spring DM Google Group对我的经验非常敏感和友善
    Spring DM Google Group 不再活跃 ,已经转移到Eclipse.org作为双子座蓝图项目, 在这里有一个论坛。

在学习新技术时,丰富的工具可以让你毫无头绪地进入事物。 此时, ops4j.org上的社区提供了一个名为“PAX”的丰富工具集,其中包括:

  • Pax Runner :轻松地在Felix,Equinox,Knopflerfish和Concierge之间切换
  • Pax构造 :轻松构build,组织和构buildOSGi项目
  • Pax Drone :在独立于框架的情况下使用JunittestingOSGi包(使用PaxRunner)

然后有许多OSGi概要服务的实现:

  • Pax Logging (logging),
  • Pax Web (http服务),
  • Pax Web Extender (战争支持),
  • Pax硬币 (configuration),
  • Pax Shell (shell实现,下一个osgi版本的一部分)
  • 以及更多。

..有一个有用的框架independend社区,但现在广告;-)

这个问题在问题提出后将近3年,但我刚发现的链接 真的很好 ,尤其是对于使用maven的初学者。 一步一步的解释。

试试http://neilbartlett.name/blog/osgibook/ 。 本书掌握了OSGi最佳实践的例子。

试试files/osgibook_preview_20091217.html

要么

http://www.manning.com/hall/

第二个不是我自己读过的书,但是我已经听到了很好的一面。

第一个对我来说非常有用。 他首先带你通过架构,然后在OSGi上实现。

您现有的应用程序是单一的还是分层的单独的stream程/层?

如果分层,则可以将中间层/应用层转换为在OSGi容器中运行。

在我的团队的经验中,我们发现尝试在OSGi中做网页的东西是痛苦的。 其他的痛点是Hibernate和Jakarta Commons Logging。

我发现OSGi规范很可读,我build议你打印出显示类加载algorithm的stream程图。 我会保证你会有这样的时刻,“为什么我会得到一个NoClassDefFoundError?”:stream程图会告诉你为什么。

如果你从OSGi开始,有几个想法需要记住。

正如本文的其他地方所提到的,了解类加载真的很重要。 根据我的经验,每个人迟早会遇到问题。

另一个要记住的重要事情是:永远不要持有引用! 查看OSGi的服务概念所在的白板模式(请参阅其他答案之一中的链接)。

根据我的经验,您不应该尝试将单核应用程序转换为基于OSGi的应用程序。 这通常会导致严重和难以控制的混乱。 重新开始。

下载一个免费的独立的oSGi实现。 我发现Knopflerfish相当好和稳定(我在许多项目中使用它)。 它还附带了很多源代码。 你可以在这里find它: http : //www.knopflerfish.org

另一个很好的教程可以在这里find。 https://pro40.abac.com/deanhiller/cgi-bin/moin.cgi/OsgiTutorial

OSGi联盟的Peter Kriens做了一个很好的采访: http : //www.infoq.com/interviews/osgi-peter-kriens 。 他的主页和博客(总是一个很好的阅读可以在这里find: http : //www.aqute.biz

我真的很喜欢Apache Felix教程 。 但是,我认为在你的应用程序中使用OSGi通常不是那种“让我们使用这个框架,因为它是炒作”的决定。 这更多的是一个devise问题,但是OSGi在devise方面给你的所有东西,你也可以使用Java。

至于运行时,你不能只是添加一个现有的应用程序,并使其OSGi启用。 它需要被devise成dynamic的。 Spring DM可以很容易地从你那里隐藏,但是它仍然存在,你需要知道它。