如何在 Tomcat 中将多个上下文映射到同一个 war 文件?

How can I map multiple contexts to the same war file in Tomcat?

提问人:Selvakumar Ponnusamy 提问时间:7/30/2012 更新时间:7/31/2012 访问量:20884

问:

我正在使用 tomcat 来部署我的应用程序,我想将它部署为一个 war 来服务器多个上下文路径。

目前我有 app1.war 和 app2.war,但两者的内容相同,只是名称不同,可以通过 http:///app1 和 http:///app1.war 访问。但我想这样做,部署 app.war 并通过 app1 和 app2 上下文路径访问它。可以在 tomcat 中做吗?请帮我解决这个问题

Tomcat 映射 上下文路径

评论

1赞 Daniel 6/10/2014
它应该仍然是同一个 Web 应用程序(共享相同的本地数据),还是 Web 应用程序真的应该是单独的实例?

答:

25赞 Christopher Schultz 7/31/2012 #1

这可以通过多种方式完成。我认为这种方式是最直接的:

  1. 将 WAR 文件移出自动部署目录webapps/
  2. 从您的 WAR 文件中提取。如果您的 WAR 没有文件,只需使用一个只有文件的文件META-INF/context.xmlMETA-INF/context.xml<Context />
  3. 将此文件作为 和 复制到 Tomcat 的目录中。([service] 通常是“Catalina”,[host] 是虚拟主机的名称:在默认的 Tomcat 配置中,主机名始终是“localhost”)。conf/[service]/[host]/app1.xmlapp2.xml
  4. 编辑 和 并将元素的属性设置为指向您在步骤 #1 中移动的 WAR 文件app1.xmlapp2.xmldocBase<Context>
  5. 重新启动 Tomcat

这应该为您提供单个物理 WAR 文件和从中部署的多个上下文。

尽管 Tomcat 支持这种配置,但我建议不要这样做:磁盘空间很便宜,它在运行时不会发生任何更改(您仍然可以获得内存中所有内容的两个副本),并且您失去了将不同的 WAR 文件部署到不同上下文和/或单独更新它们的灵活性,而无需修改两个上下文的配置。

如果你想要我的建议,请坚持使用重复的 WAR 文件。

评论

1赞 Conan 3/28/2014
我想我同意坚持使用重复的 WAR,但我处于类似的情况,发现使用单个工件来推动持续交付管道非常整洁。还值得一提的是,如果您将 WAR 放在主机 appBase 之外,则无法解压缩它们(从 Tomcat v7 开始),因此,如果您有一个需要解压缩的应用程序(可悲的是,就像我一样),则上述选项不是一种选择。
1赞 Christopher Schultz 3/29/2014
此类 WAR 可以拆包,但您必须自己拆包。当然,可以编写所有这些脚本。
0赞 Christopher Schultz 5/30/2018
@peterh 那么,你一定误解了问题,或者误解了答案,或者两者兼而有之。在不同的上下文之间共享一个 WAR 文件仍然可以让你得到两个完全独立的 s 和整个(字面上)数据堆,这些数据对于每个上下文的部署都是分开的。您不会通过在上下文之间共享 WAR 文件来节省 JVM 内存的单个字节。因此,我关于“磁盘空间[便宜]”的评论。ClassLoader
0赞 Christopher Schultz 5/30/2018
@peterh我不知道......内存也很便宜。应用程序的内存由应用程序正在创建的工作对象控制,而不是由内存中对象的表示形式控制。因此,通过部署第二个上下文将堆大小加倍应该不会有太大区别。ClassClassLoader
2赞 Christopher Schultz 2/17/2021
@Edward 您可能想在另一个问题中提出这个问题,但简而言之:不,使用单个 WAR 文件(或 WAR 结构的目录)不会缩短启动时间。您将为每个上下文获得一个单独的 ClassLoader,并且您的应用程序将启动 N 次。您可能希望研究 Tomcat 中的“并行部署”,它可以同时启动您的应用程序,而不是串行启动,尤其是在启动时有可用容量的情况下。