【问题标题】:eclipse/tomcat: deploy doesn't work any more (ClassNotFoundException)eclipse/tomcat:部署不再起作用(ClassNotFoundException)
【发布时间】:2011-08-21 13:15:10
【问题描述】:

我在 Linux Ubuntu Natty Narwhal 中运行 Eclipse Helios Service Release 1 和 Tomcat 7.0.12。

我一直很高兴地重新部署我的 web 应用程序,直到它显然无缘无故停止工作。显示以下异常:

SEVERE: Allocate exception for servlet Index
java.lang.ClassNotFoundException: obliquid.servlet.Index
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
  • Servers 选项卡中,我有“Tomcat v7.0 Server at localhost [Started,Synchronized]
  • 我的项目显示为 Tomcat v7.0 Server 的子项
  • 在属性、Java 构建路径、源中,我有 Project/src 源文件夹
  • 在“属性”、“Web 部署程序集”中,我有以下映射:/WebContent -> //src -> /WEB-INF/classes, /test -> /build/classes
  • 我的 src 目录在 obliquid/servlet/Index.java 中包含一个 Servlet
  • 我已经尝试点击 Clean Module Work Directory...Publish
  • 我尝试从 Eclipse 服务器选项卡中停止和启动服务器

我还应该检查什么?谢谢。

更新尽管我现在正在处理新项目,但我还是回来检查旧项目,而且神秘地现在它正在工作。我想我将无法找到发生了什么。

但是今天在新项目中,我遇到了没有明显原因的 404 错误,我发现右键单击 Tomcat 服务器并选择“清理...”可能很有用。也许它会有所帮助。

选择“清理...”表示:“清理将丢弃所有发布状态并从头开始重新发布。您确定要清理所有已发布资源吗?”。选择是,我解决了问题

更新 2 在新项目上又发生了。 404 错误,这次不会消失。

Stop -> Clean... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Clean... -> Start (404)
Stop -> Remove on the application ->  Clean... -> Run As -> Run on Server -> (404)  
Exit Eclipse, Start Eclipse
Start the server -> (404)

UPDATE 3 原来,这一次我只是没有注意到启动过程中监听器类引起的异常。解决问题后,它起作用了。我想我应该在凌晨 3 点停止工作。

【问题讨论】:

  • 尝试删除所有项目,重新启动 Tomcat,然后再次添加项目。
  • 谢谢Sandman,我试过你的建议:从服务器中删除所有项目,重新启动,然后我选择运行方式->在服务器上运行,提示我添加项目,但还是一样。沿着这条线,我正在考虑尝试开始一个新的 Web 项目,移动所有源代码和库,看看是否有帮助。
  • 我已经安装了 Eclipse Helios SR 2,创建了一个不同名称的新动态 Web 项目,复制了所有源代码,复制了所有 JSP 和其他资源,同时重新组织了库,现在它起作用了...我认为我的问题是个愚蠢的问题,实际上我仍然不知道出了什么问题
  • Tomcat 在热部署方面非常糟糕。我总是禁用它并手动重新启动(通过键盘快捷键)。只需 3 秒,几乎与 hotdeploys 一样长。考虑 Glassfish,它在热部署方面要好得多,它几乎是实时发生的。
  • 谢谢BalusC,我会试试的。无论如何,在我的情况下,停止/启动也没有帮助,所以我认为有些事情搞砸了......实际上现在新项目热部署再次工作,而且速度非常快。这个问题可能仍然是个谜……我以为周围有一些清单。

标签: java linux eclipse tomcat classnotfoundexception


【解决方案1】:

我可以通过禁用 maven 特性来解决这个问题(右键单击项目 >> maven >> 禁用 maven 特性)。然后重新启用它(右键单击项目>>配置>>转换为maven项目)。我已经尝试了上述所有其他提示和技巧,但这是最终奏效的方法。

【讨论】:

    【解决方案2】:

    我想知道当我看到 +25接受答案时,它真的准确吗?

    首先,如果您要删除服务器,那么清理它的意义何在?这会花费你不必要的时间,而且你不会得到任何有用的东西。

    所以我会说 5、6、7 步就可以发挥作用

    5 删除服务器文件夹

    6 重启Eclipse

    7 创建新服务器,添加项目并启动

    【讨论】:

    • 对所有的粗体感到失望?
    • 我一般用粗体来突出重点,这样即使你没有时间阅读详细的答案,用户也可以相当容易地理解解决方案。
    • 这似乎是最快的解决方案。但是,要研究操作的结果,请查看复制所有内容的文件夹:your-eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\ 有时,当您创建一个新服务器时将创建新的 tmpX 文件夹。在这些 tmp 文件夹中,您会找到 wtpwebapps 或类似的东西 - 如果一切正常,您应该会找到所有已发布的文件。
    • 即使是你的也过于复杂了......仅仅删除并重新创建服务器就可以了......但是这个 Eclipse 永无止境的废话真烦人:(
    【解决方案3】:

    我目前正在努力解决同样的问题,但这里提到的任何内容都对我没有帮助。无论如何,我发现如果我:

    1. 在 Eclipse 中停止服务器
    2. 在其他地方运行 tomcat(在我的例子中是 xamp 发行版)
    3. 停止当前运行的tomcat
    4. 在eclipse中启动tomcat

    一切正常,当然,直到我更改代码中的某些内容并再次尝试对其进行测试。

    【讨论】:

      【解决方案4】:

      我在编程方面获得了一些新经验,我不再对 Eclipse + Tomcat 组合感到饥饿。这里有几种方法可以帮助您摆脱使用该组合的需要:

      首先,不要一起使用!

      • 您可以使用其他可用的 IDE,例如IntellijIdea(不是免费的,但值得投资)有一个属性,当您调试 Java 代码时,您可以即时更改代码并逐个编译 Java 文件,然后它会建议您是否想要拥有它在服务器上更新。几乎从不需要重新启动(当然它有时会丢失,但主要是它可以工作)。

      • 使用独立的 tomcat 服务器,而不是 Eclipse/IDE 中的那个。第一个技巧仅在您调试外部服务器时才有效,在 IDE 中没有任何作用。第二个提示:如果您碰巧只更改了jsp或html内容,可以使用unix cp或windows复制命令将这些文件手动复制到tomcat的webapp文件夹中的正确位置,如果您碰巧长时间在同一个文件中开发文件,您可以根据需要多次复制文件夹内容(例如 myFolder/*.jsp),并且根本不需要重新启动。当您触摸或编辑并保存 webapps 文件夹中的 web.xml 文件,然后在浏览器上刷新可见页面时,更改就会可见。可能用 CTRL+F5 硬刷新是最好的方法。

      感谢@Verdan 关于他的评论,否则我不会再回来回答了。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题 - 尝试了以上所有方法,当我尝试启动服务器时 Eclipse 总是冻结,即使我删除了所有服务器配置并使用新下载的 tomcat 实例创建了一个新配置。无论如何,直到我搬到一个新的工作区,重新导入项目并创建一个新的服务器,问题才得到解决。对我来说似乎是一个 Eclipse 错误......所以如果没有其他工作,这就是要走的路......

        【讨论】:

          【解决方案6】:

          我发现这个过程很有用:

          • 点击服务器选项卡,如果正在运行则停止正在使用的服务器
          • 再次右键单击服务器并选择清理...
          • 再次右键单击并选择Clean Tomcat Work Directory...

          希望 ClassNotFoundException 现在应该消失了。

          另外一次,我在服务器启动时启动了一个类,监听器类 (ServletContextListener) 中出现异常。当 ServletContextListener 在启动期间引发异常时,应用程序部署将中止,因此出现 404 错误。在这种情况下,修复导致异常的问题,使应用程序再次运行。

          编辑:这个较短的程序大部分时间都对我有用,但今天没有用,我不得不遵循 Mico 的扩展程序。我的建议是,如果您有类似的问题,请先尝试这个较短的过程。如果问题仍然存在,请尝试使用 Mico's。

          【讨论】:

            【解决方案7】:

            说到Tomcat的热部署,确实会遇到各种各样的问题,其中最少的就是内存泄漏,这就是为什么你必须重新启动应用程序的原因。我建议尝试 JRebel 以快速完成“进行并保存任何更改,然后刷新浏览器并立即查看更改”。您可以找到 JRebel 动手实验室,它展示了如何将它与 Tomcat 和 Eclipse 一起使用。 http://www.javapassion.com/rebels/jrebel_basics/

            【讨论】:

              【解决方案8】:

              我建议您停止并重新启动 Tomcat 服务器。热部署不会永远有效;有一些问题会导致您在几次重新部署后必须重新启动。

              【讨论】:

              • 感谢您的回答 duffymo,但我也尝试过...我已将其添加到原始问题的列表中。
              【解决方案9】:

              这可能是我在con-fess 2011 上学到的。对我来说,这听起来像是一个类加载器问题。

              背后的理论:

              • Java 不仅使用类的类型,还使用加载它的类加载器来识别实例的类型。这意味着一个简单的操作可能会失败,例如

                A 类 a1 = 新 a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA(); a1 = a2;

              如果 SomeOtherClass 使用不同的类加载器,此示例将失败,因为 Java 会说它们不一样。

              • 演讲者还提到,一些服务器默认使用大约 45 个不同的类加载器。

              这在实践中意味着什么:

              你将你的 webapp 部署到服务器上,一切运行良好。服务器缓存类和他在某处加载它们所需的一切。现在您进行热部署,服务器可能会使用新的(或不同的)类加载器加载新类。这是它开始变得危险的地方,因为从现在开始,您的内存中有两个不同的类,它们应该是相同的。诸如强制转换 (ClassA a = (ClassA) new ClassA()) 之类的简单操作失败,找不到类中的新方法(因为服务器采用了没有此方法的缓存版本),....

              这是我重新启动服务器、清理工作目录(以摆脱缓存的版本)并开始考虑热部署的关键点。

              如果可以尝试 Mikkos procedere 并解决问题,那么此说明可以帮助您理解原因。

              我知道这并不能解决您的问题,但可以给您一些提示,可能会发生什么。

              【讨论】:

              • 很有趣,谢谢,看来我现在想了解更多关于这个主题的信息。我会研究的。
              【解决方案10】:

              在 Tomcat 6 和 Eclipse Ganymede 上,我发现以下链可以像魅力一样工作:

              1 停止服务器

              2 项目 -> 清理

              3 项目构建(我禁用了自动构建)

              4 删除服务器

              5 删除服务器文件夹

              6 重启Eclipse

              7 创建新服务器,添加项目并启动 :)

              需要一些时间,但效果很好。我的问题是一个恼人的侦听器启动问题,但这似乎是类似的:tomcat 的一个属性。顺便说一句:现在我也是 Glassfish 的忠实粉丝。

              【讨论】:

              • 这是在 Windows 机器上,但其他设置接近类似
              • 问题又出现了,这次我的小顽皮狗拔掉了我5岁的Linux笔记本电脑,没有电池。我尝试了您的部分程序(停止服务器、项目-> 清理、(自动重建)、启动服务器)但没有成功。所以我尝试了(停止服务器,右键单击服务器列表 -> 清理...,发布,启动服务器)并且它有效,但在我还尝试“清理 Tomcat 工作目录...”之前。我怀疑,但现在无法证明这个序列是否有效:(停止服务器,右键单击服务器 -> 清理 Tomcat 工作目录...,右键单击服务器 -> 清理...,启动服务器)。
              • @stivlo:我并不是说我的方法是唯一有效的方法,但我可以说我的这 7 个步骤总是成功的。很高兴听到另一种可能的路径,但正如你所说,它们应该首先得到验证。我可以说我的已经验证过了!
              • 谢谢。但为什么?!为什么会出现这种垃圾?! :(
              • 我知道正在讨论的问题与我在stackoverflow.com/q/46008116/421049 中遇到的问题并不完全相同,但是当@mico 顺便指出他已禁用自动构建时,这完全解决了我的单独问题。谢谢。
              猜你喜欢
              • 2013-05-18
              • 2019-08-11
              • 1970-01-01
              • 1970-01-01
              • 2012-04-20
              • 2011-01-15
              • 2016-03-01
              • 2020-10-31
              • 1970-01-01
              相关资源
              最近更新 更多