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.

EDIT:

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

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

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

Я в отчаянии!!

Ответы

Ответ 1

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

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

См. также:

Ответ 2

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

Ответ 3

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

Ответ 4

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