不同的WAR文件,共享资源

8
假设您有几个应用程序共享相同的代码和大部分其他资源,但外观和感觉有所不同,某些标签会更改等(考虑品牌)。如果每个Web应用程序都要放在自己的WAR文件中,那么您应该把共享的资源放在哪里呢?
我已经使用类路径来共享类和属性文件。但JavaScript和CSS文件怎么办?最好的方法是创建并部署一个额外的WAR文件,为任何其他应用程序提供这些共享文件吗?
我还考虑过一个构建脚本,能从一个公共源中生成(稍微)不同的WAR文件,但我不喜欢它,因为当您需要构建/测试/运行单个应用程序时,它只会不必要地使事情复杂化。
如有其他提示和技巧,请告诉我。
6个回答

5
您可以将两个WAR部署在同一个EAR中,并将公共资源放在EAR中。然后,在Web应用程序的清单中放置适当的依赖项,以链接到EAR中的JAR文件。

5
我曾经看到过一种针对产品线配置的策略,它在使用maven构建时使用WAR overlays。您定义一个包含通用内容的常见WAR文件,并将其与包含特定内容的其他WAR文件叠加以生成每个应用程序的不同WAR文件。如果您在不同机器上部署WAR变体,则此方法可能最有用。但我不确定是否真的可以推荐这样做。
请记得指定覆盖配置,如果您实际上覆盖了某些内容,因为否则覆盖顺序是不确定的。甚至可能会随着maven-war-plugin的升级而改变(在我们的情况下确实如此)。

3
如果您不想走EAR路线,使用tomcat等等;还有其他几种方法可以实现您想要的一致性。如果您只想共享js和css,请查看pack:tag。您可以从apache服务器托管.js和.css,设置httpd.conf以便您的Web应用程序可以调用它,然后从应用程序wars中使用pack:tag - 一步完成DRY和压缩。

0
把你的CSS和JS放在类路径中,然后使用servlet来提供它们怎么样?这样,您可以将常见资源构建为JAR文件,该JAR文件甚至可以包含servlet(如果您喜欢,则为资源分派器),并且WAR文件可以在WEB-INF / lib文件夹中包含JAR文件。

您也可以通过这种方式发送图片。 - Lars Juel Jensen

0
感谢迄今为止的回复,但我恐怕忘了提到这些WAR将部署在彼此完全隔离的不同环境中。
因此,可能唯一的选择是在实际应用程序旁边部署一个公共WAR。 我想我会采取以下措施:
  • WAR1,WAR2包含特定于应用程序的内容
  • CommonWAR包含通用内容(别开玩笑)
  • EAR1:WAR1 + CommonWAR,在env1中部署
  • EAR2:WAR2 + CommonWAR,在env2中部署

在这种情况下,CommonWar 没有任何作用。只需将共享资源放入每个 WAR 的 lib 目录或 EAR 本身中即可。WAR 不仅仅是打包资源的工具,EAR 才是其目的所在。虽然如果您简单地将其放入每个 WAR 中,则需要较少的配置。 - Robin
是的,但如果我在每个WAR文件中放置公共资源,那么我会复制这些资源:不会这样做。如果我将公共资源放在EAR文件中,则必须包含所有依赖于这些资源的WAR文件:也不能这样做,每个环境必须部署一个WAR。 - eljenso
既然您无论如何都要在每个EAR中部署CommonWAR,那么同样的重复就存在了,而且您将代码包装在WAR中是没有必要的。 - Robin
CommonWAR被部署在两个EAR中,但它是同一个CommonWAR,因此它在“开发”方面不会重复。老实说,我已经回退到2个EAR文件和一个WAR文件,请参阅我的更新帖子 :) - eljenso

0

更新

是的,我又来了。我已经改变了主意(又一次 :))。 我目前正在尝试(这里更谨慎):

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

配置文件由WAR获取。它在EAR类路径上,并且只包含一个属性“应用程序”及其值。单个WAR将根据需要使用此信息来区分两个应用程序(配置,样式表等)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接