Почему я получаю NoClassDefFoundError в HttpServletRequest, который указывает на ServletFileUpload? - PullRequest
5 голосов
/ 28 января 2011

Я недавно начал использовать JMeter для тестирования моего веб-приложения локально на моем компьютере.У меня есть страница JSP для загрузки изображений.Изображения обрабатываются моим сервлетом.Когда я попробовал этот процесс сегодня, я получил следующее исключение / ошибку:

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    org.apache.commons.fileupload.servlet.ServletFileUpload.isMultipartContent(ServletFileUpload.java:68)
    spyder.servlets.imageProcessing.ImageProcessingServlet.uploadEditedImagesToDB(ImageProcessingServlet.java:527)
    spyder.servlets.imageProcessing.ImageProcessingServlet.doPost(ImageProcessingServlet.java:153)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Вот код моего сервлета, на который ссылается исключение -

boolean isPart = ServletFileUpload.isMultipartContent(req);

....и да, я поместил все необходимые import утверждения в классе.

Я не могу вспомнить, чтобы в моей системе были какие-либо изменения, которые могли бы вызвать эту проблему.Этот процесс всегда запускался без каких-либо проблем, поэтому я не понимаю, что сейчас вызывает его сбой.Я думаю, это довольно случайно, что после того, как я использую JMeter, он терпит неудачу ...

Ответы [ 2 ]

9 голосов
/ 28 января 2011

Все сторонние библиотеки веб-приложений, такие как Commons FileUpload, принадлежат /WEB-INF/lib вашего веб-приложения, а не где-либо еще. Это исключение может возникать всякий раз, когда вы помещаете его в JRE/lib или JRE/lib/ext.

И действительно, как упоминает Божо, вам также нужно убедиться, что вы не переместили / не скопировали / не продублировали какие-либо специфичные для servletcontainer библиотеки (которые должны быть оставлены нетронутыми в Tomcat/lib) в разных местах пути к классам. Но это не должно было привести к тому, что ИМО привела бы к такого рода исключениям. По сути, это говорит о том, что загрузчик классов, который загрузил API-интерфейс FileUpload, совершенно не знает об API сервлетов.

Если вы прочитаете Tomcat, загружающий HOW-TO , то вы увидите, что библиотеки в JRE/lib и JRE/lib/ext загружаются другим загрузчиком классов ( bootstrap ) чем в Tomcat/lib ( common ) и /WEB-INF/lib ( webapp ). Загрузчик классов начальной загрузки не знает общих библиотек и библиотек веб-приложений. Это наоборот. Классический загрузчик common знает о загрузчике классов bootstrap , а загрузчик классов webapp знает об обоих. Поскольку Servlet API обычно загружается загрузчиком классов common , это может означать только то, что API FileUpload был загружен загрузчиком классов bootstrap . И это неправильно :) 1031

2 голосов
/ 28 января 2011

Это означает, что ваш контейнер сервлетов не имеет API сервлетов. Возьми чистую установку Tomcat и попробуй развернуть там. Сначала убедитесь, что у вас есть сервлет api jar в tomcat/lib. И убедитесь, что у вас его нет в webapps/yourapp/WEB-INF/lib

...