Почему я получаю 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