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

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

Проблема. У меня есть веб-приложение spring 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.

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

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

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

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

Ответ 1

Взгляните на раздел "Развертывание развертывания" в разделе свойств проекта. Содержимое этой страницы указывает, как ваш проект должен быть собран в запущенное приложение. В частности, это место, где вы можете контролировать, какие библиотеки, с которыми ссылается ваш проект, должны быть упакованы вместе с ним. Выберите Add → Java Build Path Entries. Вы сможете выбрать среди ваших существующих записей пути построения, чтобы включить их в сборку.

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

Ответ 2

Проверьте файл .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>**

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