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>**
Это сработало для меня.
Ответ 3
Кажется, вам нужно дополнительно установить плагин Maven Integration для WTP.
Его описание можно найти на issues.sonatype.org.