eclipse / tomcat:deploy不再起作用(ClassNotFoundException)

时间:2011-05-09 09:26:17

标签: java linux eclipse tomcat classnotfoundexception

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

我很高兴热重新部署我的webapp,直到它显然没有理由停止工作。显示以下异常:

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)
  • 服务器标签中我“在localhost上使用Tomcat v7.0服务器[已启动,已同步]
  • 我的项目显示为Tomcat v7.0 Server的子项
  • 在属性,Java构建路径,源我 Project / src 源文件夹
  • 在属性,Web部署程序集中,我有以下映射: / WebContent - > / / src - > / WEB-INF / classes / test - > /建造/类
  • 我的 src 目录包含 obliquid / servlet / Index.java
  • 中的Servlet
  • 我已经尝试点击清洁模块工作目录... 发布
  • 我试图从Eclipse Servers选项卡中停止并启动服务器

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

更新尽管现在我正在使用这个新项目,但我回来检查旧项目,并且神秘地现在它正在工作。我想我无法找到发生的事情。

然而今天在新项目中,我有404错误没有明显的原因,我发现右键单击Tomcat服务器并选择“Clean ...”可能很有用。也许它可以帮助。

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

更新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)

更新3 事实证明,这次我没有注意到启动期间由侦听器类引起的异常。解决问题后,它起作用了。我猜我应该在凌晨3点停止工作。

10 个答案:

答案 0 :(得分:36)

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

1停止服务器

2项目 - >清洁

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

4删除服务器

5删除Servers文件夹

6重启Eclipse

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

需要一些时间,但工作就像魅力。我的问题是一个令人恼火的Listener启动问题,但这似乎是类似的东西:tomcat的一个属性。顺便说一句:现在我也是一个大型的Glassfish粉丝。

答案 1 :(得分:12)

我发现这个程序很有用:

  • 点击服务器标签,如果正在运行,则停止正在使用的服务器
  • 再次右键单击服务器并选择清除...
  • 再次右键单击并选择清除Tomcat工作目录...

希望ClassNotFoundException现在应该消失了。

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我想知道 +25 接受答案是否真的准确

首先,如果您要删除服务器,那么清理它的重点是什么?它会不必要地花费你的时间,你将获得无用的东西。

所以我会说 5,6,7步应该做魔术

5删除Servers文件夹

6重启Eclipse

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

答案 4 :(得分:1)

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

背后的理论:

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

    ClassA a1 = new a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA(); a1 = a2;

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

  • 该发言者还提到,有些服务器默认使用大约45种不同的类加载器。

这在实践中意味着什么:

您将Web应用程序部署到服务器,一切运行正常。服务器缓存类和他需要的所有东西,以便在某处加载它们。现在您进行热部署,服务器可以使用新的(或不同的)类加载器加载新类。这就是它开始变得危险的地步,因为从现在开始你在内存中有两个不同的类应该是相同的。像强制转换(ClassA a =(ClassA)new ClassA())这样的简单操作失败,找不到类中的新方法(因为服务器采用没有此方法的缓存版本),....

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

如果可以尝试Mikkos procedere并解决了这个问题,这个解释可以帮助你理解原因。

我知道这并不能解决你的问题,但可以给你一些暗示可能发生的事情。

答案 5 :(得分:1)

我在编程方面获得了一些新的经验,而且我不再痴迷于Eclipse + Tomcat组合。这里有几种方法可以帮助您不再使用该组合:

首先,不要一起使用它们!

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

  1. 在eclipse中停止服务器
  2. 在别处运行tomcat(在我的情况下是xamp发行版)
  3. 停止当前正在运行的tomcat
  4. 在eclipse中启动tomcat
  5. 一切正常,当然直到我在代码中更改某些内容并尝试再次测试它。

答案 9 :(得分:0)

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