【问题标题】:How do I make Tomcat stop caching my servlet responses?如何让 Tomcat 停止缓存我的 servlet 响应?
【发布时间】:2009-01-06 04:57:14
【问题描述】:

我正在学习 Servlets 编程,在 Ubuntu 8.10 机器上使用 Apache Tomcat 6,但我遇到了一个非常烦人的问题——显然,与缓存有关。

这就是我正在做的事情:我编写了一个 servlet,将它放在一个很好的目录结构中,然后使用 Tomcat Web 应用程序管理器进行部署。它按预期工作。然后我编辑 servlet,重新编译并尝试再次访问它,但 Tomcat 一直返回相同的旧版本。重新加载应用程序甚至重新启动服务器都不起作用。唯一有效的是“取消部署”应用程序,然后重新部署它。

每次对代码进行任何小的更改时,我都必须这样做。太烂了。

我确信有办法解决这个问题,但我在网络上的任何地方都找不到答案(我确实搜索了很多)。我真的很感激任何帮助。谢谢!

【问题讨论】:

    标签: java tomcat servlets caching


    【解决方案1】:

    Adeel Ansari 的建议是有缺陷的:您永远不应该使用特定于 webapp 的配置来修改 CATALINA_HOME/conf/context.xml。这就是 your-webapp/META-INF/context.xml 的用途。

    您也不应该指定 的“docBase”属性。 你也不应该指定 的“路径”属性。

    OP 有几个选项:

    1. 使用管理器重新加载 Web 应用程序(不需要取消部署/重新部署:简单的重新加载应该可以工作) (http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Reload_An_Existing_Application)

    2. 将 META-INF/context.xml 中的元素设置为具有 reloadable="true" (http://tomcat.apache.org/tomcat-6.0-doc/config/context.html)

    恕我直言,如果您需要有关 Tomcat 的帮助,请加入用户的邮件列表并获得一些真正的答案。

    【讨论】:

    • "你永远不应该使用 webapp 特定的配置来修改 CATALINA_HOME/conf/context.xml。" - 那么如何在不重新编译应用程序的情况下提供容器特定参数呢?是否建议应该为每个部署环境构建新版本的应用程序?
    • @PetrGladkikh 我建议将 Web 应用程序所需的所有配置捆绑在 WAR 文件中,而不是隐藏在其他地方(例如 conf/context.xml)。定义JNDI DataSources适合server.xml然后使用<ResourceLink>,但是你不想通过修改conf/context.xml来修改整个容器上所有webapps的默认配置。
    • 同意@PetrGladkikh 并对克里斯托弗舒尔茨的回答表示歉意。官方文档有关于在 catalina context.xml 中定义一些东西并在 aplication xml 中派生的页面。首先是 Admin ,下一个 Programmer 。这是非常有用的技术,为两者提供了很好的可能性(单独的范围)
    • 这是一个奇怪的建议。更改 context.xml 的全部意义在于,您可以将相同的战争部署到具有不同配置的不同服务器上。
    • @xpusostomos 有两个 context.xml 文件。其中一个对于部署在该 Tomcat 实例上的每个应用程序都是全局的,另一个对单个应用程序是私有的。我提倡使用特定于应用程序的而不是全局的。
    【解决方案2】:

    我在 Tomcat 5.5 中遇到过类似的问题。我从来没有弄清楚根本原因,但我通过从 %CATALINA_HOME%/work/Catalina/localhost 中删除与 webapp 对应的文件夹来解决它。它不是一个很好的解决方案,但它避免了您必须取消部署/重新部署整个应用程序。

    【讨论】:

    • 确实可以。实际上,该目录是一个缓存。所以,删除它,将解决问题。但有时你介意每次都删除它,你测试一下。
    • 实际上我已经在其他地方看到过这个技巧,但它对我不起作用。 CATALINA_HOME/work/Catalina/localhost/my_project_name 在这里只是一个空目录,如果我删除它没有任何变化。
    • 它可能在其他地方缓存东西。或者您是否没有任何 JSP 或暂时从未请求过任何 JSP。因为 /work/Catalina/localhost/... 是保存编译 JSP 的目录,而不是 servlet 或其他类。
    【解决方案3】:

    在您的 TOMCAT_HOME/conf/ 下,您将找到一个名为 Context.xml 的文件。内容如下所示,

    <Context>
        <!-- Default set of monitored resources -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>WEB-INF/classes</WatchedResource>
    </Context>
    

    这里两行都没有注释,你也应该取消注释。您可能会评论第二个,或者根本没有评论。尝试取消注释它,或者在后一种情况下添加它。我假设您在 TOMCAT_HOME/webapps 下部署您的应用程序。

    [已编辑]

    尝试在 Context 元素下使用 docBasepath 属性。下面是例子

    <Context docBase="path-to-WEB-INF" path="/your-app">
    

    注意:不要包含 WEB_INF

    [已编辑]

    可能是我遗漏了什么。检查this。它是相同的,但更清晰和更具描述性,包括很少的其他选项。

    【讨论】:

    • 我在 CATALINA_BASE/conf/ 找到了 context.xml(localhost:8080 上的默认主页告诉我关于 CATALINA_HOME 和 CATALINA_BASE,我不确定这是否与 TOMCAT_HOME 相同)。无论如何,我添加了第二行,重新启动服务器,但没有结果:-(
    • 顺便说一句,我正在使用 Web 应用程序管理器来部署(和取消部署)它——据我所知,它在 CATALINA_BASE/webapps 下。
    • 是的,CATALINA_HOME 或 BASE 是一样的。你用的是netbeans吗?您的应用程序是否有单独的上下文文件?我的意思是 .xml
    • 我没有使用 Netbeans。我唯一拥有的 XML 文件是 web.xml。
    • 刚刚试过了,还是不行。我会阅读你提供的链接上的文档,看看我能不能弄明白。
    【解决方案4】:

    你没有说你是使用ubuntu tomcat还是从tomcat.apache.org单独下载。如果您使用的是 ubuntu,请尝试使用单独的下载使其更简单。标准下载非常易于管理,而且适合开箱即用。可能(我不知道)ubuntu 的配置可能更多地用于生产用途,例如它可能会有些硬化。

    tomcat 的推荐生产设置正是您所描述的(例如,没有自动部署等)。开发设置更易于使用。

    【讨论】:

      【解决方案5】:

      如果您使用 Netbeans,那么它会在您保存文件时自动重新编译该类并将其注入到正在运行的 webapp 中。不涉及其他步骤,只需点击保存即可。

      【讨论】:

      • 不,不会。您需要构建它然后重新部署它,以查看更改。他/她不想重新部署。编译源代码不同,取决于 IDE 设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多