Tomcat父webapp由可配置的子webapp共享

时间:2009-11-19 04:04:53

标签: java tomcat web-applications

目前,我们支持许多使用相同Web应用程序的客户端,但每个客户端都有不同的配置来访问其数据库,设置文件等。随着客户端列表的增长,更新Web应用程序变得越来越艰巨,并且重复资源浪费了内存,文件空间等。

我们想要做的是拥有一个由所有儿童网络应用共享的父网络应用。然后让每个子Web应用程序只携带特定于它们的文件。当子Web应用程序启动时,Tomcat从父Web应用程序加载Web应用程序,然后在相同的程序包结构后覆盖子Web应用程序中定义的任何文件。

我们一直在谷歌搜索,并没有找到一个现成的或完整的解决方案。我们看过的解决方案:

  1. Tomcat common / share - 可以处理类和JAR文件,但我们没有办法处理驻留在WEB-INF目录上的静态和JSP资源。
  2. CATALINA_BASE似乎更适合运行我们宁愿避免的多个Tomcat实例
  3. Maven可能的解决方案,但我们不是Maven的忠实粉丝,所以宁愿避免使用它。
  4. 有人对如何解决这个问题有什么建议或想法吗?如果无法进行Tomcat配置,那么不同的应用程序服务器(如Glassfish)或用于更新动态文件的工具(如OSGi,rsync)如何。如果可能,想要删除资源重复。

    谢谢。

3 个答案:

答案 0 :(得分:1)

没有“父”或“子”webapps这样的东西。它不是J2EE规范和AFAIK的一部分,任何应用程序服务器都不支持它。

那就是说,你的问题是双重的:

1)拥有共享资源。假设“资源”意味着静态资源(images / CSS / javascript / etc ...),这部分非常简单。

  • 如果它们是真正共享的(例如,您不需要在某些Web应用程序中使用单独的版本),请将它们托管在其他位置(单独的“常用”Web应用程序或将Apache放在Tomcat前面并将它们托管在那里。< / LI>
  • 如果您 需要拥有某些资源的“本地”版本,您可以做一些聪明的conditional URL rewriting或者只是编写一个检查特定资源是否存在的servlet在本地,如果没有,从“共同”位置拿走它。
  • 预编译JSP,因此您只需要处理JAR。
  • 如果您的Tomcat实例仅托管您的应用,您确实可以将您的JAR放在shared(或lib最新版本中);否则你可以在每个应用程序中部署它们。

2)简化部署。我不确定这里的大问题是什么......编写一个基于“common”和“per”的Ant(批处理,shell,你有什么)脚本来组装和部署WAR是相当简单的-app“目录结构。

或者,您可能需要查看使用JNDI来严重减少必须部署的文件数量(理论上,每个应用程序只需一个context.xml

答案 1 :(得分:0)

如果您在网络应用中使用Spring,则可以构建父子层次结构 - Using a shared parent application context in a multi-war Spring application

即。您可以在'parent'上下文中定义所有共享内容,并使用'child'上下文来使用它。

答案 2 :(得分:0)

如果您只是设置了文件和配置更改,则可以通过context.xml管理这些更改,然后您可以将每个应用程序上下文的docBase指向公共目录,以便所有应用程序共享相同的源。

缺点是应用程序的更改需要重启tomcat。

如果您想覆盖逻辑,这不能解决您的问题。

我正在探索类似场景的一个选项是将客户端自定义部分移动到ajax小部件/小工具中。然后让它成为配置文件的一部分,告诉应用程序为哪个客户端提取哪个版本的小工具。

您可以查看有关应用程序在此处共享文档库的文档http://tomcat.apache.org/tomcat-5.5-doc/config/context.html