开始使用OSGI的最佳方法是什么?
是什么使应用程序功能的模块/服务/位特别适合OSGi模块?
我对在我的应用程序中使用OSGi感兴趣。我们是一家Java商店,我们广泛使用Spring,因此我倾向于将Spring动态模块用于OSGi(tm)服务平台。我正在寻找一种将OSGi的少量内容集成到应用程序中作为试验的好方法。这里有没有人使用过此技术或者类似的OSGi技术?有陷阱吗?
@Nicolas谢谢,我已经看过那个了。这是一个很好的教程,但是我正在寻找更多关于如何制作我的第一个"真实" OSGi软件包的想法,而不是" Hello World"示例。
@david感谢链接!理想情况下,使用未开发的应用程序,我会将整个设计设计为动态的。不过,我现在正在寻找的是将其引入现有应用程序的一小部分。假设我可以选择该应用程序的任何部分,那么有哪些因素需要考虑才能使该部分作为OSGi豚鼠变得更好或者更糟?
解决方案
回答
我真的很喜欢Apache Felix教程。但是,我认为通常来说,在应用程序中利用OSGi并不是那些"让我们使用此框架,因为这是大肆宣传"的决定之一。这更多是一个设计问题,但是OSGi在设计方面为我们提供的所有内容,也可以在香草Java中获得。
至于运行时,我们不能仅添加一个现有应用程序并将其启用OSGi。需要将其设计为动态的。 Spring DM可以很容易地将其隐藏起来,但是它仍然存在,我们需要意识到这一点。
回答
好吧,由于我们不能拥有一份OSGi和一份非OSGi,因此我们需要使整个应用程序成为OSGi。以最简单的形式,我们可以在整个应用程序中制作一个OSGi捆绑包。显然,这不是最佳实践,但是对于在OSGi容器(Equinox,Felix,Knoplerfish等)中部署捆绑软件很有用。
为了使应用程序更上一层楼,我们将需要开始将应用程序拆分为多个组件,组件通常应具有一系列职责,这些职责可以通过一组接口和类依赖关系与应用程序的其余部分隔离。纯粹是手工识别它们,范围很广,对于设计良好的高凝聚力但松散耦合的应用程序来说,很简单,而对于我们不熟悉的互锁源代码,则是一场噩梦。
诸如JDepend之类的工具可以提供一些帮助,该工具可以向我们展示Java软件包与系统中其他软件包/类的耦合。具有低传出耦合的包装比具有高传出耦合的包装更容易提取到OSGi捆中。借助诸如Structure 101之类的专业工具,我们甚至可以获得更多的体系结构见解。
纯粹从技术层面上讲,每天使用包含160个OSGi软件包的应用程序并使用Spring DM,我可以确认从"正常" Spring到Spring DM的过渡是无痛苦的。额外的名称空间以及我们可以(并且应该)将OSGi特定的Spring配置隔离在单独的文件中的事实,使得无论有没有OSGi部署方案都可以更轻松地拥有。
OSGi是一个广泛的组件模型,我建议我们使用以下文档:
- OSGi R4规范:获得Core和Compendium规范的PDF,它们是规范的,权威的和高度可读的。随时都有方便的快捷方式,我们将向他们咨询。
- 阅读OSGi最佳实践,可以做很多事情,但是应该做的事情要少一些,有些事情则永远不要做(例如,DynamicImport:*)。
一些链接:
- OSGi最佳实践和使用Apache Felix
- Peter Kriens和BJ Hargrave在有关OSGi最佳实践的Sun演示中
- OSGi的一个关键概念是服务,了解为什么以及如何用白板模式取代侦听器模式
- 根据我的经验,Spring DM Google Group反应灵敏且友好。Spring DM Google Group不再活跃,并已迁移到Eclipse.org作为Gemini Blueprint项目,该项目在此处设有论坛。
回答
我们现有的应用程序是整体的还是在单独的流程/层中分层的?
如果是分层的,则可以将中间层/应用程序层转换为在OSGi容器中运行。
根据我的团队的经验,我们发现尝试在OSGi中进行Web填充很痛苦。其他痛点是Hibernate和Jakarta Commons Logging。
我发现OSGi规范可读性强,建议我们打印出显示类加载算法的流程图。我保证我们会说:"为什么会收到NoClassDefFoundError?":流程图将告诉我们原因。
回答
如果我们开始使用OSGi,请牢记一些想法。
如本线程其他地方所述,了解类加载确实很重要。以我的经验,每个人迟早都会遇到问题。
要记住的另一重要事项是:永远不要保留引用!看一下构建OSGi服务概念的白板模式(请参阅其他答案之一中的链接)。
以我的经验,我们不应该尝试将单一应用程序转换为基于OSGi的应用程序。这通常会导致严重且难以处理的混乱。重新开始。
下载免费提供的独立oSGi实现之一。我发现Knopflerfish相当好且稳定(我在许多项目中都使用了它)。它还带有许多源代码。我们可以在这里找到它:http://www.knopflerfish.org
在这里可以找到另一个很好的教程。 https://pro40.abac.com/deanhiller/cgi-bin/moin.cgi/OsgiTutorial
OSGi联盟的Peter Kriens接受了很好的采访:http://www.infoq.com/interviews/osgi-peter-kriens。他的主页和博客(可随时在这里阅读,始终是一本好书):http://www.aqute.biz
回答
尝试http://neilbartlett.name/blog/osgibook/。本书提供了有关OSGi最佳实践的示例。
回答
在学习新技术时,丰富的工具将使我们轻松进入工作。
此时,ops4j.org上的社区提供了一个称为" PAX"的丰富工具集,其中包括:
- Pax Runner:轻松运行并在Felix,Equinox,Knopflerfish和Concierge之间切换
- Pax Construct:使用maven轻松构建,组织和构建OSGi项目
- Pax无人机:在不依赖框架的情况下,通过Junit测试OSGi软件包(使用PaxRunner)
然后有许多OSGi纲要服务的实现:
- Pax日志记录(logging),
- Pax Web(http服务),
- Pax Web Extender(战争支持),
- Pax硬币(配置),
- Pax Shell(shell实现,下一个osgi版本的一部分)
- 以及更多。
..并且有一个有用的框架独立社区,但是那就是广告;-)