gpt4 book ai didi

configuration - 在 Tomcat *WITHOUT* 更改部署描述符 (web.xml) 启动时加载上下文/servlet

转载 作者:行者123 更新时间:2023-11-28 21:52:08 25 4
gpt4 key购买 nike

我有一个 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 >,所以 Tomcat 一直等到第一个请求。我真的不想解压第三方 foo.war编辑他们的 web.xml。另外,每次供应商发布其 .war 的新版本时,我都必须这样做。

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

最佳答案

这很棘手。您受限于 Tomcat 和其他容器的约定,因此没有直接的解决方案。

您可以使用全局 web.xml 从 .war 使用 <load-on-startup> 初始化特定的 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 启动过程中运行此脚本或类似脚本。希望这会有所帮助。

关于configuration - 在 Tomcat *WITHOUT* 更改部署描述符 (web.xml) 启动时加载上下文/servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/475037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com