使用Eclipse和Tomcat时出现servlet的java.lang.ClassNotFoundException错误

14

我正在使用Eclipse开发一个Java Web应用程序,使用Servlet进行测试,并在我的本地主机上使用Tomcat服务器进行测试。我已经将应用程序部署到Tomcat中,但当我尝试在浏览器中加载目标URL时,我收到以下堆栈跟踪:

Jul 31, 2013 2:58:31 PM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet ImageServlet as unavailable
Jul 31, 2013 2:58:31 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ImageServlet
java.lang.ClassNotFoundException: test.ImageServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:527)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:137)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:865)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)  

ImageServlet类明显位于我的Eclipse工作空间中的myproject/src/test文件夹中,其中myproject是Eclipse项目的名称,test是包名。

web.xml位于myproject/web/WEB-INF/web.xml,而myproject.xml位于myproject/myproject.xml。

web.xml的内容如下:

<?xml version="1.0"?>
<web-app 
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>test.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/image</url-pattern>
    </servlet-mapping>
</web-app>

我的project.xml文件内容如下:

请问有谁能向我展示如何修复我的代码,以便它不会抛出ClassNotFoundException异常?


在我的情况下,我发现项目的构建路径没有引用有效的servlet-api.jar文件。因此,我通过指向有效的jar文件并删除旧引用来配置构建路径。 - Sen
7个回答

25
有时在创建过滤器或servlet时,类文件不会在eclipse的构建文件夹中生成。清理应用程序并重新构建一次,则会在上述路径中生成 .class 文件。这在某些情况下可以解决类未找到错误。

3
感谢您抽出时间回答这个问题并点赞。希望您的答案能够帮助其他人。 - CodeMed
1
清理项目确实有帮助..谢谢! - Akhil Jain
1
不要忘记启用自动构建 项目 > 自动构建 - aliopi
启用自动构建项目 > 自动构建。这有助于我的项目维护和清理。谢谢 aliopi。 - asifaftab87

7
  1. 右键点击项目,选择“属性”
  2. 进入“部署组件”
  3. 确保您有以下图片中所示的两个映射。 Eclipse中的Web部署组件。如果没有,请添加缺失的映射。
  4. 点击应用。
  5. 清理、构建并运行您的项目。

3

最近在我的一个项目中遇到了这个问题(我之所以这样说是因为另一个项目尽管使用相同的JAR和所有内容,但完全没有问题)。多次尝试清理项目,多次删除.metadata文件夹。什么都没用。类根本没有编译。

有效的方法是在项目的构建路径中删除未绑定的jre6库。


2
如果您的项目是Maven项目,可以尝试对其进行清理。点击 Project > Clean 并选择要清理的项目。
有时,如果您在控制台和Eclipse中使用Maven,目标文件会变“疯”,唯一的解决方法就是清理项目。
另一种情况是,您需要在项目属性(例如Tomcat 9.0)中添加相应的服务器运行时。

2

这是一个Maven项目吗?在Maven项目中,src/test是单元测试的位置,被排除在构建和war之外。尝试更改包名称并再次尝试。


谢谢,但这不是一个Maven项目。请看我对duffymo的评论。+1尝试帮助。还有其他建议吗? - CodeMed

2

看起来你正在构建一个基于Maven的项目,但是你把类放在了错误的位置。

你应该使用 src/main/java 来放置你的类,使用 src/test/java 来放置测试(例如,如果你有任何JUnit测试)。


@Christian Meneses 谢谢你,但这不是一个Maven项目。+1 为你的帮助尝试。还有其他想法吗? - CodeMed

1
如果您的WEB-INF/classes中没有test.ImageServlet类,则Tomcat将无法找到它。
我猜测您没有正确地编译、打包和部署WAR文件到Tomcat。

@dyffymo 谢谢你的建议,但我正在使用上下文路径和XML配置文件从Tomcat管理应用程序中部署。这种方法已经在其他应用程序中成功运行,而不需要使用WAR文件。你能否提供一些与我采取的方法相符的建议?感谢你的帮助。 - CodeMed
不,我建议创建一个正确的WAR文件。不要被它之前“工作过”的事实所迷惑。WAR是正确的选择。依赖Eclipse并不可靠。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接