spring - 在 Impala 和 OSGi 之间进行选择

标签 spring osgi

我一直在调查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/

相关文章:

java - Class.getName() 的静态调用

java - 什么是合理的 OSGi 开发流程?

java - OSGi - 检查一组 bundle 是否可以一起启动(在运行之前)

maven - OSGi 和 Maven 检测私有(private)包的使用

java - 为什么 servlet 名称附加到请求的 map url 后面?是否可以有没有 Servlet 名称前缀的 URL?

java - 如何使用参数化注释指定方法及其使用 @Pointcut 的值

java - hibernate 拦截器

spring - 注释数组作为注释的参数,在 Scala 中

java - 如何找到并停止所有当前正在运行的线程?

使用 Hamcrest 进行 Spring MVC 测试 : how count and test the properties number/size of an object inside a Model