我正在开发一个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)
我将所有库都放在WEB-INF / lib中。
编辑:
servlet-api.jar在正确的目录(tomcat / lib)中,所有其他库都在WEB-INF / lib中
我想也许问题可能如下: 我正在Eclipse中开发这个Web项目,我在类路径中导入了文件上传库。
它是如何起作用的?
我很绝望!!
答案 0 :(得分: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项目中,您可以在项目属性的目标运行时部分中对其进行修改。
答案 1 :(得分:8)
您必须错误地将commons-fileupload.jar复制到JRE/lib/ext
,JRE/lib/endorsed
,或者将其放在不具有servlet API可见性的类路径上。使用-verbose:class
启动JVM,它将打印加载ServletFileUpload
类的类路径。如果从WEB-INF/lib
以外的任何位置加载类,则需要将其删除。
答案 2 :(得分:0)
从JRE / lib或JRE / lib / ext中删除任何servlet-api.jar或上传帮助jar commons 。这有助于我解决问题。
答案 3 :(得分:0)
旧线程但仍可以帮助某人。 我看到我在测试范围包含的依赖项中有一个javax-servlet jar。我提供了范围。如果您使用的是Eclipse + Maven,请检查依赖关系图。