it-roy-ru.com

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

Я разрабатываю сервлет, который получает многочастный запрос с содержимым нескольких файлов, и я использую библиотеки загрузки файлов Apache commons.

Когда я вызываю метод parseRequest(request);, сервлет выдает следующее исключение:

Grave: Servlet.service() for servlet DiffOntology threw exception
Java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    at org.Apache.commons.fileupload.servlet.ServletRequestContext.getContentType(ServletRequestContext.Java:73)
    at org.Apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.Java:882)
    at org.Apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.Java:331)
    at org.Apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.Java:349)
    at org.Apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.Java:126)
    at DiffOntology.doPost(DiffOntology.Java:38)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.Java:738)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:127)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:298)
    at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:852)
    at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:588)
    at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:489)
    at Java.lang.Thread.run(Thread.Java:619)

Я поместил все библиотеки в WEB-INF/lib.

Правка:

servlet-api.jar находится в правильном каталоге (Tomcat/lib), а все остальные библиотеки находятся в WEB-INF/lib

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

Как это не работает?

Я в отчаянии!

14
pAkY88

Это может произойти, если вы поместили серверные библиотеки в /WEB-INF/lib веб-приложения или, возможно, JRE/lib. Большой шанс, что вы скопировали туда Tomcat /lib/servlet-api.jar. Ты не должен этого делать. Это приведет только к коллизиям в пути к классам, что приведет к такого рода ошибкам и сделает ваше веб-приложение непереносимым (т. Е. Оно связано только с Tomcat, его нельзя запускать на других серверах, таких как Glassfish, JBoss AS, Websphere). , так далее). Вы должны хранить серверные библиотеки в их расположении по умолчанию. Очистите /WEB-INF/lib от любых серверных библиотек и очистите JRE/lib от любых сторонних библиотек.

Вы, вероятно, скопировали туда серверные библиотеки, потому что не смогли скомпилировать свои сервлеты. Копирование библиотек в /WEB-INF/lib - неправильное решение. Вы должны просто указать эти библиотеки в classpath времени компиляции. Поскольку вы используете Eclipse, это можно сделать легко: сначала добавьте Tomcat в виде Servers, затем свяжите ваш проект веб-приложения со встроенным экземпляром Tomcat. Таким образом, Eclipse автоматически добавит специфичные для сервера библиотеки в путь сборки проекта. В новом веб-проекте вы можете выбрать сервер во время создания проекта. В существующих веб-проектах вы можете изменить его в разделе Targeted Runtimes в свойствах проекта.

Смотрите также:

14
BalusC

Вы должны были неправильно скопировать файл commons-fileupload.jar в JRE/lib/ext, JRE/lib/endorsed или иным образом поместить его в путь к классам, который не имеет видимости для API сервлетов. Запустите JVM с помощью -verbose:class, который выведет, какой путь к классу загрузил класс ServletFileUpload. Если класс загружен из любой точки, кроме WEB-INF/lib, вам необходимо удалить его.

8
Brett Kail

Старый поток, но все еще может кому-то помочь ... Я увидел, что у меня есть javax-сервлет в зависимости, включенной в область тестирования. Я сделал это в предусмотренном объеме. Проверьте граф зависимостей, если вы используете Eclipse + Maven.

0
Sandeepraj Singh

Удалите все servlet-api.jar или jar commons , помогающие загрузить файлы, из JRE/lib или JRE/lib/ext. Это помогло мне решить проблему.

0
Vijay Kumar Kanta