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

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

Когда я звоню 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.

Править:

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

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

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

Я являюсь отчаянным!!

14
задан skaffman 18 May 2012 в 15:45
поделиться

2 ответа

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

8
ответ дан 1 December 2019 в 12:38
поделиться

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

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

См. также:

14
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: