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

新手上路,请多包涵

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

当我调用 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)

我把所有的库都放在 WEB-INF/lib 中。

编辑:

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

我认为问题可能出在以下方面:我正在 Eclipse 中开发这个 Web 项目,并且我在类路径中导入了文件上传库。

它怎么不起作用?

我很绝望!!

原文由 pAkY88 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 823
1 个回答

当您将特定于服务器的库放在 webapp 的 /WEB-INF/lib 或者可能是 JRE/lib 中时,就会发生这种情况。您很有可能将 Tomcat 的 /lib/servlet-api.jar 复制到那里。你不应该那样做。这只会导致类路径中的冲突,从而导致此类错误,并且会使您的 webapp 不可移植(即它只能在 Tomcat 上运行,您不能在 Glassfish、JBoss AS、Websphere 等其他服务器上运行它, ETC)。您应该将特定于服务器的库保存在它们的默认位置。从任何特定于服务器的库中清除 /WEB-INF/lib JRE/lib ,并从任何第 3 方库中清除 —。

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

也可以看看:

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题