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

我正在开发一个servlet接收多个请求的多个文件的内容,我使用Apache公共的file upload库。

当我调用parseRequest(request); 方法servlet抛出以下exception:

 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中开发这个Web项目,并且在classpath中导入了file upload库。

如何不起作用?

我很绝望!!

当您将特定于服务器的库放入/WEB-INF/lib应用程序的/WEB-INF/lib或可能是JRE/lib时,可能会发生这种情况。 /lib/servlet-api.jar可能你把Tomcat的/lib/servlet-api.jar复制到那里。 你不应该这样做。 这只会导致类path中的冲突,导致这种错误,这将使您的Web应用程序不可移植(即它只能在Tomcat上运行,不能在Glassfish,JBoss AS,Websphere等其他服务器上运行)等等)。 您应该将特定于服务器的库保留在默认位置。 从任何特定于服务器的库中清除/WEB-INF/lib ,并从任何第三方库中清除JRE/lib

您可能在那里复制了特定于服务器的库,因为您无法编译您的servlet。 复制/WEB-INF/lib中的/WEB-INF/lib是错误的解决scheme。 你应该基本上只是在编译时类path中指定这些库。 由于您使用的是Eclipse,因此可以轻松完成:首先在Servers视图中添加Tomcat,然后将您的webapp项目与集成的Tomcat实例相关联。 这样Eclipse会自动将特定于服务器的库添加到项目的构buildpath中。 在全新的Web项目上,您可以在项目创build向导中select服务器。 在现有的Web项目上,您可以在项目属性中的“ 目标运行时”部分进行修改。

也可以看看:

  • 如何在Eclipse项目中导入javax.servlet API?

您必须将commons-fileupload.jar错误地复制到JRE/lib/extJRE/lib/endorsed ,否则将其放置在对servlet API无法识别的类path中。 用-verbose:class启动JVM,它将打印哪个classpath加载了ServletFileUpload类。 如果该类从WEB-INF/lib以外的任何地方加载,则需要将其删除。

从JRE / lib或JRE / lib / ext中删除任何servlet-api.jar或上传帮助jar commons 。 这帮助我解决了这个问题。