我从第三方供应商处获得了foo.war
个文件。我通过创建包含以下内容的conf/Catalina/localhost/foo.xml
在我的Tomcat配置中定义了一个上下文:
<Context docBase="/path/to/foo.war" ...> ... </Context>
我希望Tomcat在启动时加载foo上下文。但WEB-INF/web.xml
文件中的foo.war
(部署描述符)不包含<load-on-startup
&gt;,因此Tomcat会等到第一个请求。我真的不想解压缩第三方foo.war
来编辑他们的web.xml。此外,每当供应商发布他们的.war新版本时,我都必须这样做。
Tomcat配置中是否有任何方法告诉Tomcat在启动时加载foo上下文?我知道在<Context>
元素中你可以设置参数,env vars等,而无需编辑web.xml。但我在Tomcat文档中找不到有关在启动时加载的任何内容。
答案 0 :(得分:3)
这很棘手。你受限于Tomcat和其他容器的约定,因此没有直接的解决方案。
您可以使用全局web.xml使用<load-on-startup>
元素从.war初始化特定的servlet和/或JSP。这是我所知道的唯一强制启动加载而不修改.war文件或其中的WEB-INF / web.xml的方法。请注意,您可能需要使用不同的名称/路径初始化servlet和JSP以避免冲突。
当然,这样做意味着你必须充分了解.war来初始化应用程序,这可能意味着查看其web.xml以确定要加载的内容。这可能会破坏目的,因为在启动时加载任何.war并不完全是一种不干涉的方法。但是通过一些额外的工作,您可以编写一个脚本,从.war文件的web.xml中提取必要的信息,并自动将其添加到您的全局web.xml中。
现在,如果您愿意考虑编写脚本以修改.war文件,您可以编写一个从.war文件中提取WEB-INF / web.xml的脚本,添加<load-on-startup>
个子元素到所有<servlet>
元素,并使用新副本更新.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
您可以在Tomcat启动时运行此脚本或类似的东西。希望这会有所帮助。