java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest [英] java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

查看:33
本文介绍了java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm developing a servlet that receives a multipart request with content of multiple files, and I'm using apache commons file upload libraries.

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

When I call parseRequest(request); method servlet throws following 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 中.

I put all libraries in WEB-INF/lib.

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

servlet-api.jar is in the correct directory (tomcat/lib) and all others libraries are in WEB-INF/lib

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

I think maybe the problem could be the following: I'm developing this web project in Eclipse, and I imported file uploads libraries in the classpath.

它怎么不起作用?

我很绝望!!

推荐答案

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

This can happen when you've placed server-specific libraries in the webapp's /WEB-INF/lib or probably JRE/lib. Big chance that you copied Tomcat's /lib/servlet-api.jar into there. You shouldn't do that. This would only lead to collisions in the classpath which leads to this kind of errors and it will make your webapp unportable (i.e. it is tied to run on Tomcat only, you can't run it at another servers like Glassfish, JBoss AS, Websphere, etc). You should keep the server-specific libraries at their default location. Cleanup the /WEB-INF/lib from any server-specific libraries and cleanup JRE/lib from any 3rd party libraries.

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

You probably copied server-specific libraries there because you wasn't able to compile your servlets. Copying the libraries in /WEB-INF/lib is the wrong solution. You should basically just specify those libraries in the compiletime classpath. Since you're using Eclipse, this can be done easily: first add Tomcat in Servers view, then associate your webapp project with the integrated Tomcat instance. This way Eclipse will automatically add the server-specific libraries to the project's buildpath. On a brand new web project you can choose the server during project creation wizard. On existing web projects, you can modify it in Targeted Runtimes section in project's properties.

这篇关于java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆