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

标签 java eclipse tomcat servlets apache-commons-fileupload

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

当我调用 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 项目,并在类路径中导入了文件上传库。

它为什么不起作用?

我很绝望!

最佳答案

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

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

另见:

关于java.lang.NoClassDefFoundError : javax/servlet/http/HttpServletRequest 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892475/

相关文章:

java - Android游戏循环中的同步

android - 我可以在多个模拟器上自动并行运行 Robotium 测试吗?

java - 带有 tomcat 的 HAproxy - 连接不足

java - 无法为当前线程获取事务同步 session

java - 如何以编程方式调用 Maven 任务

java - 谁调用了我的 Java 应用程序?

java - 用 Java 控制 Arduino

android.widget.RadioButton 无法转换为 android.widget.Spinner

Tomcat5 启动 - 拒绝对 catalina.out 的许可

jsp - 为什么我在 tomcat 中部署我的 java web 项目后显示 404