提问人:Selvakumar Ponnusamy 提问时间:7/30/2012 更新时间:7/31/2012 访问量:20884
如何在 Tomcat 中将多个上下文映射到同一个 war 文件?
How can I map multiple contexts to the same war file in Tomcat?
问:
我正在使用 tomcat 来部署我的应用程序,我想将它部署为一个 war 来服务器多个上下文路径。
目前我有 app1.war 和 app2.war,但两者的内容相同,只是名称不同,可以通过 http:///app1 和 http:///app1.war 访问。但我想这样做,部署 app.war 并通过 app1 和 app2 上下文路径访问它。可以在 tomcat 中做吗?请帮我解决这个问题
答:
25赞
Christopher Schultz
7/31/2012
#1
这可以通过多种方式完成。我认为这种方式是最直接的:
- 将 WAR 文件移出自动部署目录
webapps/
- 从您的 WAR 文件中提取。如果您的 WAR 没有文件,只需使用一个只有文件的文件
META-INF/context.xml
META-INF/context.xml
<Context />
- 将此文件作为 和 复制到 Tomcat 的目录中。([service] 通常是“Catalina”,[host] 是虚拟主机的名称:在默认的 Tomcat 配置中,主机名始终是“localhost”)。
conf/[service]/[host]/
app1.xml
app2.xml
- 编辑 和 并将元素的属性设置为指向您在步骤 #1 中移动的 WAR 文件
app1.xml
app2.xml
docBase
<Context>
- 重新启动 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我不知道......内存也很便宜。应用程序的内存应由应用程序正在创建的工作对象控制,而不是由内存中对象的表示形式控制。因此,通过部署第二个上下文将堆大小加倍应该不会有太大区别。Class
ClassLoader
2赞
Christopher Schultz
2/17/2021
@Edward 您可能想在另一个问题中提出这个问题,但简而言之:不,使用单个 WAR 文件(或 WAR 结构的目录)不会缩短启动时间。您将为每个上下文获得一个单独的 ClassLoader,并且您的应用程序将启动 N 次。您可能希望研究 Tomcat 中的“并行部署”,它可以同时启动您的应用程序,而不是串行启动,尤其是在启动时有可用容量的情况下。
评论