不同的WAR文件,共享资源
Posted
技术标签:
【中文标题】不同的WAR文件,共享资源【英文标题】:different WAR files, shared resources 【发布时间】:2010-09-24 23:12:55 【问题描述】:假设您有几个应用程序共享相同的代码和大多数其他资源,但外观和感觉有些不同,一些标签发生了变化,等等(想想品牌)。如果每个 web 应用都在自己的 WAR 文件中,你把共享资源放在哪里?
我已经使用类路径来共享类和属性文件。但是 javascript 和 css 文件呢?最好的方法是创建和部署一个额外的 WAR 文件,将这些共享文件提供给需要它们的任何其他应用程序?
我还想到了一个构建脚本,它可以发挥一些魔力,并从一个共同的来源发出(稍微)不同的 WAR,但我不喜欢它,因为它只会在您需要构建/测试/运行时使事情变得不必要地复杂化一个应用程序。
任何其他提示和技巧将不胜感激。
【问题讨论】:
【参考方案1】:您可以在同一个 EAR 中部署两个 WAR,并将公共资源放在 EAR 中。然后将适当的依赖项放入 web 应用程序的清单中,以链接到 ear 中的 jar 文件。
【讨论】:
【参考方案2】:在使用maven 构建时,我看到用于此类产品线配置的一种策略是使用WAR overlays。您定义一个包含通用内容的通用 WAR,并将其与包含特定内容的其他 WAR 覆盖,以便为每个应用程序生成不同的 WAR。如果您在不同的机器上部署 WAR 变体,此方法可能最有用。但我不确定我是否真的可以推荐这个。
如果您实际覆盖内容,请记住指定覆盖配置,因为否则覆盖顺序是不确定的。它甚至可能会随着 maven-war-plugin 升级而改变。 (在我们的案例中确实如此。)
【讨论】:
【参考方案3】:如果你不想走EAR路线,使用tomcat等;还有其他几种方法可以实现您想要的一致性。
如果您只想分享 js 和 css,请查看pack:tag。您可以从 apache 服务器托管 .js 和 css,设置您的 httpd.conf 以便您的 webapps 可以调用它,然后使用您的应用程序战争中的 pack:tag - 一步完成 DRY 和压缩。
【讨论】:
【参考方案4】:感谢到目前为止的回复,但恐怕我忘了提到 WAR 将部署在彼此完全隔离的不同环境中。
所以也许在实际应用程序旁边部署一个通用 WAR 是唯一的选择。我想我会选择以下内容:
WAR1、WAR2 包含应用特定的内容 CommonWAR 包含常见的东西(不是开玩笑) EAR1:WAR1 + CommonWAR,部署在 env1 中 EAR2:WAR2 + CommonWAR,部署在 env2 中【讨论】:
CommonWar 在这种情况下毫无用处。只需将您的公共资源放在每个 WAR 的 lib 目录或 EAR 本身中。战争不仅仅意味着打包资源,EAR 服务于这个目的。虽然如果你简单地把它放在每个 WAR 中,则需要更少的配置。 是的,但是如果我将公共资源放在每个 WAR 文件中,那么我会复制这些资源:不会那样做。如果我将公共资源放在 EAR 文件中,那么它必须包含依赖于这些资源的所有 WAR 文件:两者都做不到,必须为每个环境部署一个 WAR。 因为无论如何您都在每个 EAR 中部署 CommonWAR,所以存在相同的重复,并且您无缘无故地将代码包装在 WAR 中。 CommonWAR 部署在两个 EAR 中,但它是 相同的 CommonWAR,因此它不是为了“开发”而复制的。老实说,我已经恢复到 2 个 EAR 文件和一个 WAR 文件,请参阅我更新的帖子 :)【参考方案5】:更新
是的,又是我。我实际上已经改变了主意(再次:))。我目前正在尝试(在这里更加谨慎):
(通用)WAR:包含应用程序,通用(大部分)+ 一些特定内容 EAR1:CommonWAR + env1 的特定配置文件 EAR2:CommonWAR + env2 的特定配置文件配置文件由 WAR 获取。它位于 EAR 类路径中,并且仅包含一个具有值的属性“应用程序”。然后,单个 WAR 将在适当的情况下使用此信息来区分两个应用程序(配置、样式表...)。
使用我的 EAR1 = CommonWAR + WAR1, EAR2 = CommonWAR + WAR2 的解决方案,如果不使用 Web url(例如使用 iText 生成的 PDF 文档中的图像),在 CommonWAR 中查找静态资源太困难或不可能。
【讨论】:
【参考方案6】:将你的 css 和 js 放在类路径中并使用 servlet 为它们提供服务怎么样?然后,您可以将公共资源构建为 jar,该 jar 甚至可以包含 servlet(如果您愿意,可以使用资源调度程序),war 文件可以包含 WEB-INF/lib 文件夹中的 jar 文件。
【讨论】:
你也可以这样发送图片以上是关于不同的WAR文件,共享资源的主要内容,如果未能解决你的问题,请参考以下文章