Почему я получаю NoClassDefFoundError в HttpServletRequest, который указывает на ServletFileUpload?

Недавно я начал использовать 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 ответа

Решение

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

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

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

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

Другие вопросы по тегам