我在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)
我还应该检查什么?谢谢。
更新尽管现在我正在使用这个新项目,但我回来检查旧项目,并且神秘地现在它正在工作。我想我无法找到发生的事情。
然而今天在新项目中,我有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点停止工作。
答案 0 :(得分:36)
在Tomcat 6和Eclipse Ganymede上,我发现以下链可以像魅力一样工作:
1停止服务器
2项目 - >清洁
3个项目构建(我禁用了自动构建)
4删除服务器
5删除Servers文件夹
6重启Eclipse
7创建新服务器,添加项目并启动:)
需要一些时间,但工作就像魅力。我的问题是一个令人恼火的Listener启动问题,但这似乎是类似的东西:tomcat的一个属性。顺便说一句:现在我也是一个大型的Glassfish粉丝。
答案 1 :(得分:12)
我发现这个程序很有用:
希望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会说它们不相同。
这在实践中意味着什么:
您将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)
我目前正在努力解决同样的问题,但这里没有提到任何帮助。无论如何,我发现如果我:
一切正常,当然直到我在代码中更改某些内容并尝试再次测试它。
答案 9 :(得分:0)
我能够通过禁用maven性质来解决这个问题(右击项目>> maven>>禁用maven性质)。然后重新启用它(右键单击项目>>配置>>转换为maven项目)。我已经尝试了上面的所有其他提示和技巧,但这是最终有效的。