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

pAk*_*Y88 14 java eclipse tomcat servlets apache-commons-fileupload

我正在开发一个servlet,它接收包含多个文件内容的多部分请求,我正在使用apache commons文件上传库.

当我调用parseRequest(request);方法servlet抛出异常时:

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)
Run Code Online (Sandbox Code Playgroud)

我把所有库放在WEB-INF/lib中.

编辑:

servlet-api.jar在正确的目录(tomcat/lib)中,所有其他库都在WEB-INF/lib中

我想也许问题可能如下:我在Eclipse中开发这个Web项目,我在类路径中导入了文件上传库.

怎么不行?

我很绝望!!

Bal*_*usC 14

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

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

也可以看看:


Bre*_*ail 8

您必须错误地将commons-fileupload.jar复制到JRE/lib/ext,JRE/lib/endorsed或以其他方式将其放在不具有servlet API可见性的类路径上.启动JVM -verbose:class,它将打印加载ServletFileUpload类的类路径.如果从其他任何地方加载类,则WEB-INF/lib需要将其删除.

  • 咦?你为什么建议把库放在`JRE/lib`中?这可能有效,但这会使您的webapp无法移植.这肯定不是正确的方法.这更像是一个黑客/解决方法. (2认同)
  • "咦?" 确实 :-).我的回答一定措辞不好,所以我更新了"错误"这个词.我并不是说他应该把罐放在JRE/lib中,我说是为了得到NoClassDefFoundError,这就是他必须做的.他需要使用_only_ WEB-INF/lib作为commons-fileupload.jar,他需要删除他添加到其他类路径的任何jar. (2认同)