如何使用OSGi模块化JSF / Facelets / Spring应用程序?

时间:2010-04-04 19:48:38

标签: java spring osgi modularization

我正在使用非常大的JSF / Facelets应用程序,它们使用Spring进行DI / bean管理。 我的应用程序具有模块化结构,我目前正在寻找标准化模块化的方法。

我的目标是从多个模块(可能相互依赖)组成一个Web应用程序。每个模块可能包含以下内容:

  • 类;
  • 静态资源(图片,CSS,脚本);
  • Facelet模板;
  • 托管bean - Spring应用程序上下文,包含请求,会话和应用程序范围的bean(替代方法是JSF托管bean);
  • Servlet API的东西 - servlet,过滤器,监听器(这是可选的)。

我想避免(几乎不惜一切代价)需要将模块资源(如Facelets模板)复制或提取到WAR或扩展模块的servlet,过滤器等的web.xml。将模块(JAR,包,工件......)添加到Web应用程序(WEB-INF/libbundlesplugins,...)以扩展Web必须足够应用此模块。

目前,我使用自定义模块化解决方案来解决此任务,该解决方案主要基于使用类路径资源:

  • 特殊资源servlet从类路径资源(JAR)提供静态资源。
  • Special Facelets资源解析器允许从类路径资源加载Facelet模板。
  • Spring通过模式classpath*:com/acme/foo/module/applicationContext.xml加载应用程序上下文 - 这会加载模块JAR中定义的应用程序上下文。
  • 最后,一对委托servlet和过滤器将请求处理委托给模块中Spring应用程序上下文中配置的servlet和过滤器。

最近几天我读了很多关于OSGi的内容,我正在考虑,如何(以及如果)我可以将OSGi用作标准化的模块化方法。我在想如何用OSGi解决个别任务:

  • 静态资源 - 想要导出静态资源的OSGi包在包上下文中注册ResourceLoader个实例。中央ResourceServlet使用这些资源加载器从bundle中加载资源。
  • Facelet模板 - 与上述类似,中央ResourceResolver使用捆绑包注册的服务。
  • 托管bean - 我不知道如果在其中一个捆绑包中定义了#{myBean.property},如何使用myBean这样的表达式。
  • Servlet API的东西 - 使用类似WebExtender / Pax Web的东西来注册servlet,过滤器等。

我的问题是:

  • 我在这里发明了一辆自行车吗?那有标准的解决方案吗?我发现提到了Spring Slices但是找不到很多关于它的文档。
  • 您认为OSGi是描述任务的正确技术吗?
  • 我的OSGI应用草图或多或少是正确的吗?
  • 如何处理托管bean(尤其是请求/会话范围)?

我非常感谢你的评论。

5 个答案:

答案 0 :(得分:13)

答案 1 :(得分:3)

我在当前项目中面临同样的问题。在我看来,OSGi是标准和未来支持方面最好,最干净的解决方案,但是如果您尝试在Web应用程序中使用它,目前可能遇到一些问题:

  1. Web容器和OSGi平台之间还没有很好的集成解决方案。
  2. 对于只搜索简单模块化架构的自定义构建Web应用程序,OSGi可能太多了。如果我的项目需要支持不受我们控制的第三方扩展,如果项目需要热重新部署,插件之间的严格访问规则等,我会考虑OSGi。
  3. 基于类加载器和资源过滤器的自定义解决方案似乎非常适合我。 例如,您可以学习Hudson source code或Java Plug-in Framework(JPF)项目(http://jpf.sourceforge.net/)。

    关于扩展web.xml,我们可能很幸运使用Servlet 3.0规范(http://today.java.net/pub/a/today/2008/10/14/introduction-to-servlet-3 html的#可插拔和延伸性)。

答案 2 :(得分:2)

Servlet 3.0 specification引入的“web模块部署描述符片段”(又名web-fragment.xml)在这里很不错。规范将其定义为:

  

网络片段是合乎逻辑的   在这样的分区中的web应用程序   使用框架的方式   在网络应用程序内可以定义所有   没有问devlopers的文物   编辑或添加信息   web.xml中。

Java EE 6现在可能不适合您。不过,它仍然是标准化的解决方案。

答案 3 :(得分:1)

企业OSGi是一个相当新的领域,因此不要认为您将获得直接满足您需求的解决方案。这就是我发现Equinox中缺少的一件事(eclipse背后的osgi引擎,因此拥有最大用户群!)是一致的配置/ DI服务。在我的项目中,我们最近有一些类似的需求,并结束了构建一个简单的配置osgi服务。

模块化应用程序固有的一个问题是DI,因为在某些情况下模块可见性可能会阻止类访问。我们使用注册的伙伴政策解决了这个问题,这个政策不太理想但有效。

除了配置之外,您还可以查看最近发布的Equinox书籍,获取有关使用OSGi作为创建模块化应用程序的基础的指导。这些示例可能特定于Equinox,但这些原则适用于任何OSGi框架。链接 - http://equinoxosgi.org/

答案 4 :(得分:0)

你应该研究一下Spring DM Server(它正在转向Eclipse Virgo,但尚未发布)。最近发布的OSGi企业规范中有很多好东西。

我想,有些Spring DM教程会有所帮助。但是,是的,可以使用标准模块化从Web包外部加载资源和类。在那,它是一个很好的选择。

对于会话上下文 - 它会按照您在会话中的预期进行处理。但是,您可能会遇到在Web捆绑包之间共享该会话的问题,以至于不确定它是否可能。

您还可以查看单个网络包,然后使用例如Eclipse扩展注册表,用于扩展您的Web应用程序的功能。