我一直在调查OSGi对于我公司的软件,但最近被推荐看一下 Impala。根据其网页,Impala是“基于 Spring 框架的基于 Java 的 Web 应用程序的动态模块框架”。
一目了然,看着这个blog post关于差异,我可以看到的主要差异是 Impala 比 OSGi 更简单,不管理第三方组件的版本控制,并且远没有被广泛使用/知道(我在 Stack Overflow 上没有看到一个关于它的问题)。
我想知道那些对 Impala 和 OSGi 有直接经验的人(即那些比阅读博客文章和在线文档更深入地研究它的人),是否对两者之间的实际差异有更多的见解,和/或关于什么类型的建议每个项目都可能或多或少适合。
编辑:包括Springsource Slices 也可能很有趣。进入比较,虽然它还只是一个早期的原型(prototype)。乍一看,它似乎只在 DM Server 中工作。
最佳答案
当涉及到模块之间的受控共享时,Impala 的模块化方法非常薄弱。问题是 Impala 仍然遵循旧的 J2EE 风格的分层方法来加载类。
任何人都可以编写一个模块系统来限制跨模块的类的可见性。困难的部分是如何重新引入模块之间的依赖关系,以便一个模块中的特定类和接口(interface)可以被另一个模块看到。在 OSGi 中,我们通过导出和导入包来做到这一点,因此我们有一个非分层的依赖关系图。
在 Impala 中,如果您想查看另一个模块中的类,那么您的模块必须是该模块的子模块或后代。也就是说,模块只能看到它们自己的类和它们祖先的类。现在,如果您想与您的兄弟模块共享一些类(例如,您都使用的库),那么您必须将该库移动到共享祖先的类路径中。在最坏的情况下,您必须将其直接移动到根模块。现在,所有其他模块都可以看到该库,无论他们是否愿意!事实上,如果另一个模块想要使用不同版本的库,他们将被阻止这样做。
如果您只是在每个使用该库的地方都有一个库的副本,那么您就无法让使用该库的模块相互通信。当他们试图在彼此之间传递对象时,他们会得到 ClassCastExceptions。
如果两个 Web 应用程序需要使用同一个库,则 J2EE 中固有的类似问题。通常,J2EE 开发人员只是复制库,但这会创建无法相互通信的“孤岛”应用程序。这根本不是构建模块化软件的方式。
史蒂文的观点似乎也很中肯。据我所知,除了它的作者之外,没有人在使用 Impala。
关于spring - 在 Impala 和 OSGi 之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1570633/