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 генерируется по указанному выше пути. В некоторых случаях это устраняет ошибку "класс не найден".
- Щелкните правой кнопкой мыши проект и перейдите в "Свойства"
- Перейти к разделу "Сборка развертывания"
- Убедитесь, что у вас есть два сопоставления, как показано на следующем рисунке. Сборка веб-развертывания в Eclipse. Если нет, то добавьте отсутствующие сопоставления.
- Нажмите применить.
- Очистите, соберите и запустите ваш проект.
Недавно столкнулся с этой проблемой в одном из моих проектов (я говорю это потому, что другой работал отлично, несмотря на использование одинаковых 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.