【问题标题】:Latest changes are not reflected in servlet (tomcat)最新更改未反映在 servlet (tomcat) 中
【发布时间】:2012-02-17 09:24:09
【问题描述】:

我正在从事我的安静项目,现在我正在使用 tomcat 和 eclipse 直到现在都正常工作..

我在 22-1-2012 部署了战争(带有一些打印消息)它工作正常然后第二天我做了一些更改删除了一些消息并重新部署了文件...在我的 webapps 文件夹中它显示最新时间对于我的战争文件的“最后修改”..我做错了什么告诉我..

P.S 对同一项目的 JSP 页面的任何更改都会反映出来,但 servlet 类没有改​​变

这是日志文件显示的内容 _SEVERE:Web 应用程序似乎已通过 java.util.Timer API 启动了一个名为 [MySQL Statement Cancellation Timer] 的 TimerThread,但未能停止它。为了防止内存泄漏,计时器(以及相关的线程)已被强制取消。 _

嗯,这是我的问题的摘要,我希望我现在可以向您解释问题 我再次执行了以下步骤
1.从webapps中删除了我的webapp目录
2.尝试访问 servlet(它显示“资源不可用”)
3.在打印语句中进行一些更改以进行调试
4.从 eclipse 重新部署 WAR
5.再次访问该 servlet 时它不是最新版本显示相同的旧消息。

现在告诉我是否有解决方案.... 在此先感谢


在尝试了这么多事情之后,我在部署 WAR 文件时观察到非 JSP servlet 类文件未包含在 WAR 中,当我在 WAR 中手动添加这些类文件时,所有更改都已更新。所以现在你能告诉我如何在 WAR 中自动部署这些。有什么问题?

【问题讨论】:

  • 我已经尝试了所有这些步骤..甚至重新启动了电脑...

标签: java eclipse tomcat


【解决方案1】:

JSP 文件没有更新,因为它们是预编译的,即使它们可能会从已更改的文件中提取信息,但每个可能受到影响的 JSP 文件都需要对其进行微小的更改,例如添加一个空格,然后删除一个空格,然后保存。

然后构建您的 WAR,然后应该会显示更新。今晚我遇到了同样的问题,其他答案都没有帮助。关键是,检查部署 WAR 的 Tomcat 目录中的文件日期。我注意到,即使我正在部署一个全新的清理过的 WAR,并删除了所有文件夹,其中仍有较旧的缓存文件,可能是因为 Eclipse 保留它们以节省编译时间,认为它们没有任何更改。

希望对你有帮助

【讨论】:

    【解决方案2】:

    在 Eclipse 中转到服务器视图:

    双击您的服务器。就我而言,它是Tomcat。

    应该会弹出一个 Tomcat Web 模块。点击最底部的模块选项卡(见图1)

    选择您的项目。单击“删除”按钮。

    图 1:

    现在您应该会在 Tomcat 选项卡旁边看到一个星号。这意味着您需要保存更改。控制 + S 也是如此。

    图2:

    在项目资源管理器中右键单击您的项目。转到 Maven -> 更新项目...

    图 3:

    现在这是重要的部分,请确保选中“强制更新快照/版本”。检查该部分至关重要。然后单击确定。

    图4:

    现在查看您的服务器视图。它应该看起来像这样,并带有“重新启动”警告,告诉您它不同步。

    图5:

    右键单击它并选择重新启动

    图6:

    让服务器重新启动。现在,如果您返回服务器视图,您应该会看到它已同步。那就是你想要的。像这样:

    图 7:

    现在您应该能够右键单击您的项目并选择“运行方式”-> 在服务器上运行,您应该会看到您的更改。

    图 8:

    如果事情仍然没有更新,请返回并查看您的服务器视图,并确保它没有像上面的图 5 那样显示重新启动的内容。如果是,请再次重启服务器,如图 6 所示。然后单击浏览器上的刷新。

    【讨论】:

      【解决方案3】:

      转到浏览器设置并清除缓存。

      【讨论】:

        【解决方案4】:

        检查 Tomcat 的日志文件,我敢打赌您的 Web 应用程序存在启动问题,并且没有部署。

        【讨论】:

        • 2011 年 1 月 22 日上午 5:27:38 org.apache.catalina.loader.WebappClassLoader clearReferenceStopTimerThread 严重:Web 应用程序似乎已通过java.util.Timer API 但未能阻止它。为了防止内存泄漏,计时器(以及相关的线程)已被强制取消。 2011 年 1 月 22 日上午 5:27:38 org.apache.catalina.startup.HostConfig deployWAR 信息:部署 Web 应用程序存档 MobileServlet.war'
        • 在部署战争时会出现上述错误。你认为重新安装tomcat会有所帮助吗?
        • 请将错误信息添加到您的原始问题中(您可以对其进行编辑)。我怀疑您显示的错误是阻止您的网络应用程序加载的错误。还有其他错误信息吗?
        • 感谢您的帮助,我已将日志文件错误添加到我的问题中
        【解决方案5】:

        现实情况是 Tomcat 无法运行它没有副本的代码。特别是如果您重新启动它。听起来您的网络应用程序有一个单独的“副本”实际上正在使用中。要么是你无意中制造的(嘿,让我们面对现实吧,我们都做过),要么是 Tomcat 在你不知道的地方制造的。

        选择您的网络应用程序中存在的唯一文件。可能是图标名称或配置文件名称。搜索整个硬盘驱动器以找到 WAR 文件的分解副本。这将有助于在临时目录或工作文件夹中找到它。一定要把它们清理干净。

        另外,请确保您正在运行您认为的 Tomcat。大多数安装了多个 Tomcat 的开发人员也犯了部署到不同位置的错误。查看进程列表以查看在启动时提供给 JVM 的参数。一定要检查环境变量,比如 CATALINA_HOME。

        编辑:您对 JSP 页面更改的更新,但类不会让我认为您在类路径上有多个 JAR 文件,其中包含相同的文件(首先加载一个旧版本)或者您更改了类名代码库,但没有更新对它的引用。

        【讨论】:

        • @rfreak 很好地部署了我的日志文件中存在以下错误 严重:Web 应用程序似乎已经通过 java.util.Timer API 启动了一个名为 [MySQL Statement Cancellation Timer] 的 TimerThread,但是未能阻止它。为了防止内存泄漏,计时器(以及相关的线程)已被强制取消您的答案看起来有效,但每次我部署时,这意味着它使用正确的 tomcat...
        • @rfreak 你能告诉我多个 JAR 编辑部分的解决方案吗?据我所知,只有 1 个 JAR 文件
        【解决方案6】:

        对同一项目的 JSP 页面的任何更改都会反映,但 servlet 类没有改​​变

        不清楚你在说什么。

        • 如果您说更新的 JSP 位于扩展的 webapp 目录中,但生成/编译的 JSP 类没有更改(在工作目录中),请尝试从工作目录中删除这些类。您可能还需要重新启动 Web 容器。

        • 如果您说非 JSP servlet 类已更新(在 web 应用程序中)但您没有运行它们,请尝试重新启动 web 容器。

        • 如果您说非 JSP servlet 类尚未在 webapp 目录中更新,那么 webapp 部署中出现了问题。关闭 Web 容器,删除 webapp 目录(以及已编译的 JSP)并重新启动 webapp。


        在尝试了这么多事情之后,我在部署 WAR 文件时观察到非 JSP servlet 类文件未包含在 WAR 中,当我在 WAR 中手动添加这些类文件时,所有更改都已更新。所以现在你能告诉我如何在 WAR 中自动部署这些。有什么问题?

        所以问题与部署无关。问题是您一开始没有正确构建 WAR 文件。

        我对此无能为力,因为我不使用 Eclipse 来构建我的 WAR 文件。 (我使用 Maven,以便构建过程是脚本化的和可重现的......并且不依赖于我每次都以正确的顺序单击正确的按钮。)

        【讨论】:

        • ..第三个是正确的非 JSP servlet 类尚未更新..我已经尝试了所有这些 1.重新启动 web 容器 2.从 webapps 中删除了 war 文件和相应的文件夹并重新部署 3 . 每次我得到以前的输出时,从 Eclipse 到 PC 的几乎所有东西都要重新启动很多次,即 2 天前更新最新的更改不会反映在非 JSP 类文件上
        • 在尝试了这么多事情之后,我在部署 WAR 文件时观察到,当我在 WAR 中手动添加这些类文件时,非 JSP servlet 类文件未包含在 WAR 中,所有更改都已更新.. 所以现在你能告诉我如何在 WAR 中自动部署这些。有什么问题?
        【解决方案7】:

        您的 tomcat server.xml 是否指向正确的工作区? 为了确保,你去 tomcat 安装目录——在 confi 文件夹中找到 server.xml

        【讨论】:

          【解决方案8】:

          对于每个 war 文件,tomcat 都会创建一个类似的命名文件夹。删除文件夹,再次尝试重新部署war,希望能反映。

          【讨论】:

            【解决方案9】:

            在 web.xml 文件的末尾添加一个字母并将其删除,然后按 enter 保存文件。之后运行程序,它会处理更新的数据。

            【讨论】:

              【解决方案10】:

              转到 catalina 主页\conf\context.xml

              <Context> 更改为<Context reloadable="true"> 确保重新启动 Tomcat。 繁荣。 不过,您可能仍需要按 F5 或 Ctrl+F5 两到三下。

              【讨论】:

              • insert reloadable=true,stackoverflow 以某种方式消除标签
              【解决方案11】:

              TL;DR:确保您的 Eclipse 项目设置为自动构建:项目 > 自动构建

              我很抱歉在没有完全了解 WAR 文件是什么的情况下回答,但我认为 WAR 文件是“build”文件夹中已编译的 .class 文件。

              我注意到当我保存我的 Servlet“HelloWorld.java”时,编译后的“HelloWorld.class”根本没有更新。我可以通过右键单击 java 项目并选择“构建项目”来强制构建项目。构建项目后,“HelloWorld.class”文件更新成功,但更新后的代码仍然没有显示在服务器上。

              要在服务器上显示结果,我必须单击我的服务器(我的服务器称为“本地主机上的 Tomcat v9.0 服务器 [已启动,同步]”),然后单击“发布到服务器”。如果您没有看到您的服务器,请执行以下操作:Window > Show View > Servers

              我什至不必重新启动服务器,几秒钟后(并刷新谷歌浏览器),网站自行更新了!

              当然,手动构建和发布(并可能重新启动)服务器对于我懒惰的手指来说有点太多了,所以我找到了解决方法。你可以去项目>自动构建。然后网站将在您保存修改后的 java 文件时更新。

              这个解决方案对我有用,因为我只是错过了自动构建。但您也可能遇到服务器无法自动发布的问题。

              我个人没有这个问题,所以我只是推测,但有一些发布设置。在“服务器”视图中,双击您的服务器名称(在我的情况下,双击“本地主机上的 Tomcat v9.0 服务器 [已启动,已同步]”)。应打开一个选项卡,显示您的服务器设置。展开标题为“发布”的部分,并根据需要设置发布设置。现在我的设置为“资源更改时自动发布”。

              不幸的是,我不知道如何让服务器在保存修改后的 .java 文件时自动重启。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-06-28
                • 1970-01-01
                • 2014-04-27
                • 1970-01-01
                • 2018-08-11
                • 2014-07-12
                • 2015-03-06
                • 1970-01-01
                相关资源
                最近更新 更多