java.lang.ClassNotFoundException для сервлета в tomcat с затмением

Я начинаю разрабатывать Java-приложение в Eclipse с использованием сервлетов и тестирую его с сервером 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 довольно четко расположен в папке myproject / src / test в моей рабочей области eclipse, где 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?

7 ответов

Иногда при создании фильтров или сервлетов файл класса не создается в папке сборки в eclipse. Очистите приложение и соберите его один раз, файл.class генерируется по указанному выше пути. В некоторых случаях это устраняет ошибку "класс не найден".

  1. Щелкните правой кнопкой мыши проект и перейдите в "Свойства"
  2. Перейти к разделу "Сборка развертывания"
  3. Убедитесь, что у вас есть два сопоставления, как показано на следующем рисунке. Сборка веб-развертывания в Eclipse. Если нет, то добавьте отсутствующие сопоставления.
  4. Нажмите применить.
  5. Очистите, соберите и запустите ваш проект.

Недавно столкнулся с этой проблемой в одном из моих проектов (я говорю это потому, что другой работал отлично, несмотря на использование одинаковых JAR-файлов и всех остальных). Несколько раз пытался очистить проект, несколько раз удалял папку.metadata. Ничего не сработало. Классы просто не были скомпилированы.

Что работало, так это удаление несвязанной библиотеки jre6 в пути сборки проекта.

Если ваш проект Maven, вы можете попробовать очистить его. Нажмите "Проект"> "Очистить" и выберите нужный проект для очистки.

Иногда, если вы используете Maven с консолью и Eclipse, цель становится "сумасшедшей", и единственный способ продолжить - очистить проект.

Это проект Maven? в проектах maven src/test является местом для модульных тестов и исключается из сборки и войны, попробуйте изменить имя пакета и повторите попытку.

Похоже, вы создаете проект на основе Maven, и вы помещаете свой класс в неправильном месте

Вы должны использовать src/main/java поставить свои занятия, и src/test/java поставить свои тесты на него (например, тесты JUnit, если у вас есть).

Если нет класса test.ImageServlet в вашем развертывании WEB-INF/classes, Tomcat не сможет его найти.

Я предполагаю, что вы не скомпилировали, не упаковали и не развернули файл WAR должным образом в Tomcat.

Другие вопросы по тегам