2013-07-31 3 views
9

Я начинаю разрабатывать Java-приложение в eclipse с помощью сервлетов и тестировать его с помощью сервера tomcat на своем локальном хосте. Я развернула применение в котом, но когда я пытаюсь загрузить целевой URL в браузере, я получаю следующую трассировку стека:java.lang.ClassNotFoundException для сервлета в tomcat с eclipse

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/тестовую папку в моей рабочей области eclipse, где myproject - это имя проекта eclipse, а тест - это пакет.

web.xml находится в MyProject/веб/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?

ответ

1

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

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

+0

@dyffymo Спасибо, но я использую путь контекста и файл конфигурации XML для развертывания из приложения менеджера Tomcat. Этот подход работал с другими приложениями без использования файлов WAR. Можете ли вы предложить что-то в соответствии с подходом, который я принимаю? +1 за попытку помочь. – CodeMed

+0

Нет, я бы рекомендовал создать правильный файл WAR. Меня бы не обманул тот факт, что он «работал» раньше. ВОЙНА - это правильная вещь. Опора на Eclipse - нет. – duffymo

2

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

+0

Спасибо, но это не проект maven. Смотрите мой комментарий к duffymo. +1 за попытку помочь. Любые другие предложения? – CodeMed

2

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

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

+0

@Christian Meneses Спасибо, но это не проект maven. +1 за попытку помочь. Любые другие идеи? – CodeMed

0

Из приведенных выше комментариев и ваших сообщений возникает ощущение, что проблема связана с вашим конфигурационным файлом, который мы не можем просмотреть здесь.

Файл конфигурации XML для развертывания из приложения менеджера Tomcat.

Возможно, это поможет решить эту проблему.

17

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

+3

+1 и спасибо, что нашли время, чтобы ответить на этот старый вопрос. Я надеюсь, что ваш ответ поможет другим людям. – CodeMed

+1

Уборка проекта, действительно помогло .. спасибо! –

+0

Не забудьте включить автоматические сборки 'Project'>' Build Automatically' – aliopi

2

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

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

+0

Спасибо и +1 за добавление понимания этого старого вопроса. – CodeMed

1
  1. правой кнопкой мыши и проекта перейдите в раздел «Свойства»
  2. Перейти к «Развертывание Ассамблеи»
  3. Убедитесь, что вы есть два отображения, как показано в следующем изображении. Web deployment assembly in eclipse. Если нет, добавьте недостающие сопоставления.
  4. Нажмите Apply.
  5. Очистите, создайте и запустите проект.
0

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

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

Смежные вопросы