不同的WAR文件,共享资源

假设您有多个应用程序共享相同的代码和大多数其他资源,但外观和感觉有所不同,某些标签更改等等(想想品牌推广)。 如果每个Web应用程序都要使用自己的WAR文件,那么您将在何处放置共享资源?

我已经使用类路径来共享类和属性文件。 但是javascript和css文件怎么样? 是创建和部署一个额外WAR文件的最佳方法,该文件将为这些共享文件提供其他应用程序所需的文件吗?

我还想到了一个构建脚本,它做了一些魔术并且从一个共同的源代码中喷出了(稍微)不同的WAR,但是我不喜欢它,因为当你需要构建/测试/运行单个应用程序时它只是不必要的复杂化。

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

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

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

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

如果你不想去EAR路线,使用tomcat等; 还有一些其他方法可以实现您想要的一致性。

如果你想只分享js和css,请查看pack:tag 。 您可以从apache服务器托管.js和css,设置httpd.conf以便您的webapps可以调用它,然后使用应用程序之战中的pack:标签 – 一步完成DRY和压缩。

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

因此,在实际应用程序旁边部署一个共同的WAR可能是唯一的选择。 我想我会选择以下内容:

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

更新

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

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

WAR将获取配置文件。 它位于EAR类路径中,仅包含一个带有值的属性“application”。 然后,单个WAR将在适当的位置使用此信息来区分两个应用程序(配置,样式表,…)。

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

如何将css和js放在类路径中并使用servlet提供它们? 然后,您可以将公共资源构建为jar,并且该jar甚至可以包含servlet(如果您愿意,还可以包含资源调度程序),war文件可以包含WEB-INF / lib文件夹中的jar文件。