首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.NoClassDefFoundError: javax/servlet/HttpServletRequest

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

Stack Overflow用户
提问于 2010-05-24 00:16:58
回答 5查看 78.8K关注 0票数 17

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

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

代码语言:javascript
运行
复制
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项目,并且我在类路径中导入了文件上传库。

它怎么不起作用呢?

我绝望了!!

EN

回答 5

Stack Overflow用户

发布于 2010-05-24 00:27:21

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

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

另请参阅:

票数 14
EN

Stack Overflow用户

发布于 2010-05-24 00:48:03

您一定是错误地将commons-fileupload.jar复制到了JRE/lib/extJRE/lib/endorsed,或者将其放在了对servlet API不可见的类路径上。使用-verbose:class启动JVM,这将打印装入ServletFileUpload类的类路径。如果类是从WEB-INF/lib以外的任何地方加载的,则需要将其删除。

票数 8
EN

Stack Overflow用户

发布于 2017-12-21 05:29:16

旧的线程,但仍然可以帮助别人。我看到在测试范围中包含的依赖项中有一个javax-servlet jar。我到达了提供的范围。如果您使用的是Eclipse +Maven,请检查依赖图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2892475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档