【问题标题】:java.lang.ClassNotFoundException for servlet in tomcat with eclipse [duplicate]java.lang.ClassNotFoundException for servlet 与 eclipse [重复]
【发布时间】:2013-08-01 16:17:12
【问题描述】:

我开始使用 servlet 在 eclipse 中开发一个 java web 应用程序,并在我的本地主机上使用 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>

而myproject.xml的内容是:

谁能告诉我如何修复我的代码,使其不会抛出 ClassNotFoundException?

【问题讨论】:

  • 就我而言,我发现项目的构建路径没有引用有效的 servlet-api.jar 文件。所以我通过指向有效的 jar 文件并删除旧的引用来配置构建路径。

标签: java eclipse tomcat servlets classnotfoundexception


【解决方案1】:

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

【讨论】:

  • +1 感谢您抽出宝贵时间回答这个老问题。我希望您的回答对其他人有所帮助。
  • 清理项目,确实有帮助..谢谢!
  • 别忘了启用自动构建Project > Build Automatically
  • “启用自动构建项目 > 自动构建”也帮助了我和清理项目。谢谢 aliopi
【解决方案2】:
  1. 右键单击项目并转到“属性”
  2. 转到“部署程序集”
  3. 确保您有两个映射,如下图所示。 Web deployment assembly in eclipse 。如果没有,则添加缺少的映射。
  4. 点击应用。
  5. 清理、构建并运行您的项目。

【讨论】:

    【解决方案3】:

    最近在我的一个项目中遇到了这个问题(我这么说是因为尽管使用了相同的 JAR 和所有项目,但另一个工作得非常好)。多次尝试清理项目,多次删除 .metadata 文件夹。没有任何效果。这些类根本没有被编译。

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

    【讨论】:

    • 感谢您和 +1 对这个老问题的见解。
    【解决方案4】:

    这是一个 Maven 项目?在 maven 项目中 src/test 是单元测试的位置,并且被排除在构建和战争之外,请尝试更改包名称并重试。

    【讨论】:

    • 谢谢,但它不是一个 Maven 项目。请参阅我对 duffymo 的评论。 +1 试图提供帮助。还有其他建议吗?
    【解决方案5】:

    看起来您正在构建一个基于 Maven 的项目,而您将类放在错误的位置

    您应该使用src/main/java 来放置您的类,并使用src/test/java 来放置您的测试(即,JUnit 测试,如果您有的话)。

    【讨论】:

    • @Christian Meneses 谢谢,但这不是一个 Maven 项目。 +1 试图提供帮助。还有其他想法吗?
    【解决方案6】:

    如果您的项目是 Maven 项目,您可以尝试清理它。单击项目 > 清理,然后选择要清理的所需项目。

    有时,如果您将 Maven 与控制台和 Eclipse 结合使用,目标会变得“疯狂”,而继续进行的唯一方法就是清理项目。

    另外,您必须在项目方面添加相应的服务器运行时(例如 Tomcat 9.0)。

    【讨论】:

    • 感谢您的有用回答。
    【解决方案7】:

    如果您的 WEB-INF/classes 部署中没有类 test.ImageServlet,则 Tomcat 将无法找到它。

    我的猜测是您没有正确编译、打包和部署 WAR 文件到 Tomcat。

    【讨论】:

    • @dyffymo 谢谢,但我正在使用上下文路径和 XML 配置文件从 Tomcat 管理器应用程序中进行部署。此方法已与其他应用程序一起使用,而无需使用 WAR 文件。你能提出一些符合我正在采取的方法的建议吗? +1 试图提供帮助。
    • 不,我建议创建一个适当的 WAR 文件。我不会被它以前“工作”一次的事实所愚弄。战争是正确的。不依赖 Eclipse。
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2013-08-07
    • 2014-04-15
    • 2012-11-15
    • 2010-11-06
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多