我正在重写一些老化的网络应用程序。其中有两个非常相似,但今天没有共享代码,我想解决这个问题。
使用Maven、Spring MVC和Sitemesh重写项目。
使用JAR文件轻易共享模型层代码。但我不知道如何在类似的应用程序之间共享通用的Web层代码(JSP和控制器)。
以下是一些背景信息。这些应用程序是网络商店。一个是普通商店(类似于amazon.com),用户可以登录、搜索产品、添加到购物车并结账。另一个基本相同,只是它是 punchout 站点。浏览产品和购物车部分完全相同。但是,登录和结账是完全不同的。
我简单地阐述了这个问题。产品浏览和购物车部分有很大一部分Web层代码应该能够在两者之间共享。
我不认为可能简单地运行相同的WAR文件作为基于环境变量或来自不同数据库的设置的“模式”。其中一个区别是完全不同的Spring Security配置。最好也将另一个站点的登录和结账控制器排除在组件扫描之外,以免通过URL操作某人错误地跨越到其他站点。
我最初使用Maven配置文件和过滤器来保留两个不同的配置集(web.xml、Spring配置等)在同一个WAR项目中。基于所选的Maven配置文件,生成的WAR将使用不同的配置集构建(并为清晰起见使用不同的名称)。这违反了Maven原则,即一个POM生成一个构件。
有更好的方法吗?Maven WAR Overlays呢?我看到人们谈论使用覆盖来共享常见资源,如CSS、JS、图像,甚至一些常见的JSP。但是我没有看到有人提到可以通过此方式共享控制器等类。
我可以把控制器类下放到JAR包中,但从逻辑上讲,它们应该与各自的JSP保持在一起。而且JSP也不能被下放到JAR包中(对吗?)。
我还考虑将其制作成一个EAR文件,其中包含多个WAR文件——一个WAR用于共同的购物体验,另一个WAR用于相应的登录和结账。我相信同一EAR中的两个WAR之间可以共享会话,但我不确定它是否与Spring的会话范围bean兼容。我听说它们并没有真正存储在会话中。我还需要想出如何处理用于页眉/页脚的Sitemesh装饰器。相同的Sitemesh配置及其资源需要复制到两个WAR中,对吗?因此,最终,购物WAR构件在每种情况下仍将有所不同。
我相信其他人以前也处理过这个问题。我想错了吗?这种情况是否有通用解决方案?
unpack
目标也不会花太长时间。 - artbristol