it-swarm.com.ru

ClassNotFoundException DispatcherServlet при запуске Tomcat (зависимости Maven не копируются в wtpwebapps)

Я сталкивался с этой проблемой несколько раз и только наткнулся на (полу) надежное решение, поэтому подумал, что я опубликую его здесь, если это поможет кому-то еще, или если я забуду его, а также спросить, если кто-то имеет представление о том, что является основной причиной и почему мое исправление работает.

Проблема в том, что у меня есть весеннее веб-приложение 3, в котором я хочу использовать опцию «Запуск на сервере» в Eclipse для запуска на сервере Tomcat 7. С некоторыми проектами это просто работает, но некоторые, кажется, приходят в неработоспособное состояние, при котором каждый раз при запуске сервера я получаю класс не найден: org.springframework.web.servlet.DispatcherServlet.

После некоторого расследования я обнаружил, что maven-зависимости проекта не были скопированы в WEB-INF/lib в ${PROJECT_LOCATION}/.metadata/.plugins/org.Eclipse.wst.server.core/tmp0/wtpwebapps/

Я перепробовал много вещей, прежде чем, наконец, заметил, что у проекта есть предупреждение на панели «Проблемы»:

Classpath entry org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result.

Возможно, я должен был заметить это раньше.

В любом случае, выбрав это и выполнив «Быстрое исправление», я решу проблему, и я смогу успешно запустить свой проект. Быстрое исправление заключается в следующем: «Пометить связанную необработанную запись пути к классу как зависимость публикации/экспорта».

Проблема в том, что, хотя это работает, я не знаю, что это значит. Я не вижу никаких явных изменений в конфигурации моего проекта после того, как он сделан. Мне бы очень хотелось узнать, в чем заключается настоящая проблема и могу ли я избежать ее повторения. Я также хотел бы знать, есть ли что-то, что я мог бы сделать сам (кроме выполнения быстрого исправления), которое бы исправило это, потому что я чувствую, что попробовал почти все остальное.

Спасибо за вашу помощь.

25
Russell

Взгляните на раздел «Сборка развертывания» в свойствах проекта. Содержание этой страницы определяет, как ваш проект должен быть собран в работающее приложение. В частности, это место, где вы можете контролировать, какие библиотеки, на которые ссылается ваш проект, должны быть упакованы вместе с ним. Выберите Добавить -> Записи пути сборки Java. Вы сможете выбрать среди существующих записей пути сборки для включения в сборку.

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

34
Konstantin Komissarchik

Проверьте файл .class и замените следующую запись

**<classpathentry kind="con" path="org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER" />**

с ниже: -

**<classpathentry kind="con" path="org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER">
  <attributes>
    <attribute name="org.Eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
  </attributes>
</classpathentry>**

Это сработало для меня.

2
Muskan

Похоже, вам нужно дополнительно установить Maven Integration для WTP plugin . Его описание можно найти по адресу questions.sonatype.org .

1
Andrius Kurtinaitis

Я столкнулся с этой проблемой сегодня, над проектом, который работал долгое время. Я испробовал все вышеперечисленные решения, но (1) я не увидел предупреждение на панели «Проблемы», как на плакате; (2) в моих записях пути сборки Java для сборки не отображалось ничего доступного для развертывания; (3) запись .classpath для org.Eclipse.jst.component.dependency уже существует; и (4) Я уже установил Maven Integration для WTP. Я наконец удалил свой проект с сервера Tomcat, а затем повторно развернул его, и проблема исчезла.

0
mojoken