不同的WAR文件,共享资源

different WAR files, shared resources

提问人:eljenso 提问时间:12/2/2008 更新时间:11/14/2013 访问量:5898

问:

假设您有几个应用程序共享相同的代码和大多数其他资源,但外观和感觉略有不同,某些标签会更改等(例如品牌)。如果每个 Web 应用程序都位于自己的 WAR 文件中,则将共享资源放在哪里?

我已经使用类路径来共享类和属性文件。但是 javascript 和 css 文件呢?创建和部署一个额外的 WAR 文件,将这些共享文件提供给任何其他应用程序需要它们的最佳方法吗?

我还想到了一个构建脚本,它有一些魔术,并且从一个共同的来源喷出(略微)不同的 WAR,但我不喜欢它,因为当你需要构建/测试/运行单个应用程序时,它只会使事情变得不必要地复杂化。

任何其他提示和技巧将不胜感激。

Java JavaScript CSS 部署

评论


答:

5赞 Robin 12/2/2008 #1

您可以将两个 WAR 部署在同一个 EAR 中,并将公共资源放在 EAR 中。然后,将相应的依赖项放在 Web 应用的清单中,以链接到 ear 中的 jar 文件。

3赞 lucas 12/3/2008 #2

如果您不想走 EAR 路线,请使用 tomcat 等;还有其他几种方法可以实现所需的一致性。

如果你只想分享 js 和 css,请查看 pack:tag。您可以从 apache 服务器托管 .js 和 css,设置 httpd.conf 以便您的 Web 应用程序可以调用它,然后在您的应用程序战争中使用 pack:tag - DRY 和压缩一步到位。

0赞 eljenso 12/3/2008 #3

感谢到目前为止的回复,但恐怕我忘了提到 WAR 将部署在彼此完全隔离的不同环境中。

因此,也许在实际应用程序旁边部署一个通用的 WAR 是唯一的选择。我想我会选择以下几点:

  • WAR1、WAR2 包含特定于应用的内容
  • CommonWAR包含普通的东西(不开玩笑)
  • EAR1:WAR1 + CommonWAR,部署在 env1 中
  • EAR2:WAR2 + CommonWAR,部署在 env2 中

评论

0赞 Robin 12/4/2008
在这种情况下,公战毫无用处。只需将每个 WAR 中的公共资源放在其 lib 目录中,或者放在 EAR 本身中即可。战争不仅仅是为了包装资源,《环境管理条例》也就是为了这个目的。尽管如果您简单地将其放在每个 WAR 中,则需要较少的配置。
0赞 eljenso 12/4/2008
是的,但是如果我将公共资源放在每个 WAR 文件中,那么我会复制这些资源:不会这样做。如果我将公共资源放在 EAR 文件中,那么它必须包含依赖于这些资源的所有 WAR 文件:两者都不能,每个环境必须部署一个 WAR。
0赞 Robin 12/12/2008
由于您无论如何都在每个 EAR 中部署了 CommonWAR,因此存在相同的重复项,并且您无缘无故地将代码包装在 WAR 中。
0赞 eljenso 12/16/2008
CommonWAR 部署在两个 EAR 中,但它是相同的 CommonWAR,因此它不会“用于开发”而复制。老实说,我已经恢复到 2 个 EAR 文件和一个 WAR 文件,请参阅我更新的帖子:)
0赞 eljenso 12/17/2008 #4

更新

是的,又是我。我实际上改变了主意(再次:))。我目前正在尝试(在这里更加谨慎):

  • (通用)WAR:包含应用程序,通用(大部分)+一些特定的东西
  • EAR1:CommonWAR + env1 的特定配置文件
  • EAR2:CommonWAR + env2 的特定配置文件

配置文件由 WAR 拾取。它位于 EAR 类路径上,并且只包含一个属性“application”和一个值。然后,单个 WAR 将在适当的情况下使用此信息来区分两个应用程序(配置、样式表等)。

使用我的 EAR1 = CommonWAR + WAR1、EAR2 = CommonWAR + WAR2 的解决方案,在不使用 Web URL 的情况下在 CommonWAR 中查找静态资源太困难或不可能(例如,使用 iText 生成的 PDF 文档中的图像)。

5赞 Dr. Hans-Peter Störr 12/18/2008 #5

我看到用于此类产品线配置的策略是在使用 maven 构建时使用 WAR 覆盖。您可以定义一个包含公共内容的通用 WAR,并将其与包含特定内容的其他 WAR 叠加,以便为每个应用程序生成不同的 WAR。如果在不同的机器上部署 WAR 变体,此方法可能最有用。但我不确定我是否真的可以推荐这个。

如果您实际覆盖了内容,请记住指定覆盖配置,否则覆盖顺序是不确定的。它甚至可能随着 maven-war-plugin 升级而改变。(在我们的例子中确实如此。

0赞 Lars Juel Jensen 11/14/2013 #6

把你的css和js放在类路径中,用servlet为它们服务怎么样?然后,您可以将公共资源构建为 jar,该 jar 甚至可以包含 servlet(如果您愿意,可以包含资源分派器),并且 war 文件可以包含 WEB-INF/lib 文件夹中的 jar 文件。

评论

0赞 Lars Juel Jensen 11/14/2013
您也可以通过这种方式调度图像