我正在使用非常大的JSF / Facelets应用程序,它们使用Spring进行DI / bean管理。 我的应用程序具有模块化结构,我目前正在寻找标准化模块化的方法。
我的目标是从多个模块(可能相互依赖)组成一个Web应用程序。每个模块可能包含以下内容:
我想避免(几乎不惜一切代价)需要将模块资源(如Facelets模板)复制或提取到WAR或扩展模块的servlet,过滤器等的web.xml
。将模块(JAR,包,工件......)添加到Web应用程序(WEB-INF/lib
,bundles
,plugins
,...)以扩展Web必须足够应用此模块。
目前,我使用自定义模块化解决方案来解决此任务,该解决方案主要基于使用类路径资源:
classpath*:com/acme/foo/module/applicationContext.xml
加载应用程序上下文 - 这会加载模块JAR中定义的应用程序上下文。最近几天我读了很多关于OSGi的内容,我正在考虑,如何(以及如果)我可以将OSGi用作标准化的模块化方法。我在想如何用OSGi解决个别任务:
ResourceLoader
个实例。中央ResourceServlet
使用这些资源加载器从bundle中加载资源。ResourceResolver
使用捆绑包注册的服务。#{myBean.property}
,如何使用myBean
这样的表达式。我的问题是:
我非常感谢你的评论。
答案 0 :(得分:13)
答案 1 :(得分:3)
我在当前项目中面临同样的问题。在我看来,OSGi是标准和未来支持方面最好,最干净的解决方案,但是如果您尝试在Web应用程序中使用它,目前可能遇到一些问题:
基于类加载器和资源过滤器的自定义解决方案似乎非常适合我。 例如,您可以学习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应用程序的功能。