【问题标题】:Load a context/servlet at startup in Tomcat *WITHOUT* changing deployment descriptor (web.xml)在 Tomcat 启动时加载上下文/servlet *不更改部署描述符 (web.xml)
【发布时间】:2010-10-03 06:24:57
【问题描述】:

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

<Context docBase="/path/to/foo.war" ...> ... </Context>

我希望 Tomcat 在启动时加载 foo 上下文。但是foo.war文件中的WEB-INF/web.xml(部署描述符)不包含&lt;load-on-startup>,所以Tomcat一直等到第一个请求。我真的不想解压第三方foo.war 来编辑他们的web.xml。另外,每次供应商发布他们的.war 的新版本时,我都必须这样做。

在 Tomcat 配置中有什么方法可以告诉 Tomcat 在启动时加载 foo 上下文?我知道在&lt;Context&gt; 元素中,您可以在不编辑web.xml 的情况下设置参数、环境变量等。但我在 Tomcat 文档中找不到任何关于启动时加载的内容。

【问题讨论】:

    标签: configuration tomcat servlets


    【解决方案1】:

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

    您可以使用全局 web.xml 使用 &lt;load-on-startup&gt; 元素从 .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,将 &lt;load-on-startup&gt; 子元素添加到所有&lt;servlet&gt; 元素,并使用新副本更新 .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 启动过程中运行此脚本或类似的脚本。希望这会有所帮助。

    【讨论】:

    • David 给出了一个很好的解决方法,我会“接受”这个答案,但我希望 Tomcat 中有一种本地方式。所以我暂时不回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2013-02-26
    • 2020-02-15
    相关资源
    最近更新 更多