Configuration 在启动时在Tomcat*中加载上下文/servlet,而不必*更改部署描述符(web.xml)

Configuration 在启动时在Tomcat*中加载上下文/servlet,而不必*更改部署描述符(web.xml),configuration,tomcat,servlets,Configuration,Tomcat,Servlets,我有一个来自第三方供应商的foo.war文件。我通过创建包含以下内容的conf/Catalina/localhost/foo.xml在Tomcat配置中定义了一个上下文: <Context docBase="/path/to/foo.war" ...> ... </Context> 。。。 我希望Tomcat在启动时加载foo上下文。但是foo.war文件中的WEB-INF/WEB.xml(部署描述符)不包含,因此Tomcat等待第一个请求。我真的不想打开第三方foo

我有一个来自第三方供应商的
foo.war
文件。我通过创建包含以下内容的
conf/Catalina/localhost/foo.xml
在Tomcat配置中定义了一个上下文:

<Context docBase="/path/to/foo.war" ...> ... </Context>
。。。
我希望Tomcat在启动时加载foo上下文。但是
foo.war
文件中的
WEB-INF/WEB.xml
(部署描述符)不包含
,因此Tomcat等待第一个请求。我真的不想打开第三方
foo.war
来编辑他们的web.xml。另外,每次供应商发布其.war的新版本时,我都必须这样做


在Tomcat配置中是否有任何方法可以告诉Tomcat在启动时加载foo上下文?我知道在
元素中,您可以设置参数、环境变量等,而无需编辑web.xml。但是我在Tomcat文档中找不到任何关于启动时加载的信息。

这很棘手。您受到Tomcat和其他容器约定的限制,因此没有简单的解决方案

您可以使用global web.xml通过
元素从.war初始化特定的servlet和/或JSP。这是我所知道的在启动时强制加载而不修改.war文件或其中的WEB-INF/WEB.xml的唯一方法。注意,您可能需要使用不同的名称/路径初始化servlet和JSP以避免冲突

当然,这样做意味着您必须对.war有足够的了解才能初始化应用程序,这可能意味着您需要查看其web.xml以确定加载什么。这可能会使目的落空,因为这并不是一种完全不需要动手就可以加载任何一个启动时的战争的方法。但是,只需做一点额外的工作,就可以编写一个脚本,从.war文件的web.xml中提取必要的信息,并自动将其添加到全局web.xml中

现在,如果您愿意考虑脚本编写来修改.WAR文件,您可以编写一个脚本,从.WAR文件中提取Web-INF/Web.xml,将<代码> <代码>子元素添加到所有元素,并用新的副本更新.WAR。我不确定您正在使用什么环境来运行Tomcat,但下面是一个bash脚本示例:

#!/bin/sh

TEMPDIR=/tmp/temp$$
WARFILE=/path-to-tomcat/webapps/foo.war

mkdir -p $TEMPDIR/WEB-INF
pushd $TEMPDIR
unzip -qq -c $WARFILE WEB-INF/web.xml \
    | sed 's#</servlet>.*#<load-on-startup>99</load-on-startup></servlet>#' \
    > WEB-INF/web.xml
zip -f $WARFILE WEB-INF/web.xml
popd
rm -rf $TEMPDIR
#/垃圾箱/垃圾箱
TEMPDIR=/tmp/temp$$
WARFILE=/tomcat/webapps/foo.war的路径
mkdir-p$TEMPDIR/WEB-INF
pushd$TEMPDIR
解压-qq-c$WARFILE WEB-INF/WEB.xml\
|sed's.*99'\
>WEB-INF/WEB.xml
zip-f$WARFILE WEB-INF/WEB.xml
邻苯二胺
rm-rf$TEMPDIR

作为Tomcat启动的一部分,您可以运行这个脚本或类似的东西。希望这能有所帮助。

David已经给出了一个很好的解决方案,我会“接受”这个答案,但我希望Tomcat有一种本土的方式。所以我暂时不回答这个问题。