我在维基百科和其他网站上读过关于OSGi的文章,但我并没有真正看到大局。它说它是一个基于组件的平台,并且您可以在运行时重新加载模块。同样,到处都给出的“实际示例”是Eclipse插件框架。

我的问题是:

OSGi清晰而简单的定义是什么? 它能解决什么常见问题?

所谓“常见问题”,我指的是我们每天都要面对的问题,比如“OSGi能做些什么来让我们的工作更高效/有趣/简单?”


当前回答

I don't care too much about the hotplugability of OSGi modules (at least currently). It's more the enforced modularity. Not having millions of "public" classes available on the classpath at any time protects well from circular dependencies: You have to really think about your public interfaces - not just in terms of the java language construct "public", but in terms of your library/module: What (exactly) are the components, that you want to make available for others? What (exactly) are the interfaces (of other modules) you really need to implement your functionality?

这很好,热插拔是附带的,但我宁愿重新启动我通常的应用程序,而不是测试所有的热插拔组合…

其他回答

I don't care too much about the hotplugability of OSGi modules (at least currently). It's more the enforced modularity. Not having millions of "public" classes available on the classpath at any time protects well from circular dependencies: You have to really think about your public interfaces - not just in terms of the java language construct "public", but in terms of your library/module: What (exactly) are the components, that you want to make available for others? What (exactly) are the interfaces (of other modules) you really need to implement your functionality?

这很好,热插拔是附带的,但我宁愿重新启动我通常的应用程序,而不是测试所有的热插拔组合…

You can, analogically speaking, change the motor of your car without turning it off. You can customize complex systems for the customers. See the power of Eclipse. You can reuse entire components. Better than just objects. You use a stable platform to develop component based Applications. The benefits of this are huge. You can build Components with the black box concept. Other components don't need to know about hidden interfaces, them see just the published interfaces. You can use in the same system several equal components, but in different releases, without compromise the application. OSGi solves the Jar Hell problem. With OSGi you develop thinking to architect systems with CBD

对于使用Java的每个人来说,有很多好处(我现在只提醒了这些)。

如果基于Java的应用程序需要添加或删除模块(扩展应用程序的基本功能),而不需要关闭JVM,则可以使用OSGI。通常,如果关闭JVM的成本比较高,那么仅仅是为了更新或增强功能。

例子:

Eclipse:为插件的安装、卸载、更新和相互依赖提供了平台。 AEM: WCM应用程序,其中功能更改将由业务驱动,无法承担维护停机时间。

注意:Spring框架停止支持OSGI Spring包,认为它对于基于事务的应用程序或这些行中的某些点来说是不必要的复杂性。我个人是不会考虑OSGI的,除非绝对必要,比如在构建平台这样的大项目中。

在OSGi上让我抓狂的几件事:

1)实现和它们的上下文加载器有很多怪癖,并且可能有点异步(我们在confluence中使用felix)。与纯spring(没有DM)相比,[main]几乎运行了所有同步。

2)热加载后类不相等。例如,在hibernate上有一个tangosol缓存层。它被Fork.class填充,在OSGi作用域之外。你热加载了一个新的罐子,Fork没有改变。Class[Fork] != Class[Fork]。由于相同的潜在原因,它也会在序列化过程中出现。

3)集群。

您可以解决这些问题,但这是一个非常麻烦的问题,并且会使您的体系结构看起来有缺陷。

对于那些为热插拔做广告的人。OSGi的#1客户端?Eclipse。Eclipse在加载包之后做什么?

它重新启动。

它还被用于在移动端带来额外的中间件和应用程序的可移植性。移动端可用于WinMo, Symbian, Android等。一旦与设备功能集成,就会出现碎片化。