提问人:eljenso 提问时间:12/2/2008 更新时间:11/14/2013 访问量:5898
不同的WAR文件,共享资源
different WAR files, shared resources
问:
假设您有几个应用程序共享相同的代码和大多数其他资源,但外观和感觉略有不同,某些标签会更改等(例如品牌)。如果每个 Web 应用程序都位于自己的 WAR 文件中,则将共享资源放在哪里?
我已经使用类路径来共享类和属性文件。但是 javascript 和 css 文件呢?创建和部署一个额外的 WAR 文件,将这些共享文件提供给任何其他应用程序需要它们的最佳方法吗?
我还想到了一个构建脚本,它有一些魔术,并且从一个共同的来源喷出(略微)不同的 WAR,但我不喜欢它,因为当你需要构建/测试/运行单个应用程序时,它只会使事情变得不必要地复杂化。
任何其他提示和技巧将不胜感激。
答:
您可以将两个 WAR 部署在同一个 EAR 中,并将公共资源放在 EAR 中。然后,将相应的依赖项放在 Web 应用的清单中,以链接到 ear 中的 jar 文件。
如果您不想走 EAR 路线,请使用 tomcat 等;还有其他几种方法可以实现所需的一致性。
如果你只想分享 js 和 css,请查看 pack:tag。您可以从 apache 服务器托管 .js 和 css,设置 httpd.conf 以便您的 Web 应用程序可以调用它,然后在您的应用程序战争中使用 pack:tag - DRY 和压缩一步到位。
感谢到目前为止的回复,但恐怕我忘了提到 WAR 将部署在彼此完全隔离的不同环境中。
因此,也许在实际应用程序旁边部署一个通用的 WAR 是唯一的选择。我想我会选择以下几点:
- WAR1、WAR2 包含特定于应用的内容
- CommonWAR包含普通的东西(不开玩笑)
- EAR1:WAR1 + CommonWAR,部署在 env1 中
- EAR2:WAR2 + CommonWAR,部署在 env2 中
评论
更新
是的,又是我。我实际上改变了主意(再次:))。我目前正在尝试(在这里更加谨慎):
- (通用)WAR:包含应用程序,通用(大部分)+一些特定的东西
- EAR1:CommonWAR + env1 的特定配置文件
- EAR2:CommonWAR + env2 的特定配置文件
配置文件由 WAR 拾取。它位于 EAR 类路径上,并且只包含一个属性“application”和一个值。然后,单个 WAR 将在适当的情况下使用此信息来区分两个应用程序(配置、样式表等)。
使用我的 EAR1 = CommonWAR + WAR1、EAR2 = CommonWAR + WAR2 的解决方案,在不使用 Web URL 的情况下在 CommonWAR 中查找静态资源太困难或不可能(例如,使用 iText 生成的 PDF 文档中的图像)。
我看到用于此类产品线配置的策略是在使用 maven 构建时使用 WAR 覆盖。您可以定义一个包含公共内容的通用 WAR,并将其与包含特定内容的其他 WAR 叠加,以便为每个应用程序生成不同的 WAR。如果在不同的机器上部署 WAR 变体,此方法可能最有用。但我不确定我是否真的可以推荐这个。
如果您实际覆盖了内容,请记住指定覆盖配置,否则覆盖顺序是不确定的。它甚至可能随着 maven-war-plugin 升级而改变。(在我们的例子中确实如此。
把你的css和js放在类路径中,用servlet为它们服务怎么样?然后,您可以将公共资源构建为 jar,该 jar 甚至可以包含 servlet(如果您愿意,可以包含资源分派器),并且 war 文件可以包含 WEB-INF/lib 文件夹中的 jar 文件。
评论
上一个:仅为 DOM 的一部分创建样式重置的最佳方法是什么?
下一个:图像和文本查询
评论