Java.lang.NoClassDefFoundError:javax/Servlet/http/HttpServletRequest

yzuktlbb  于 2022-10-15  发布在  Java
关注(0)|答案(7)|浏览(252)

我正在开发一个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项目,并且我在类路径中导入了文件上传库。
怎么就不管用了呢?
我绝望了!!

b5buobof

b5buobof1#

当您在Web应用程序的/WEB-INF/lib或可能的JRE/lib中放置特定于服务器的库时,可能会发生这种情况。你很有可能把Tomcat的/lib/servlet-api.jar复制进去了。你不该那样。这只会导致类路径中的冲突,从而导致此类错误,并将使您的Web应用程序不可移植(即,它仅限于在Tomcat上运行,您不能在其他服务器上运行它,如GlassFish、JBoss AS、Websphere等)。您应该将特定于服务器的库保留在其默认位置。从任何特定于服务器的库中清除/WEB-INF/lib,并从任何第三方库中清除JRE/lib
您可能将特定于服务器的库复制到那里,因为您无法编译您的Servlet。复制/WEB-INF/lib中的库是错误的解决方案。基本上,您应该只在编译时类路径中指定这些库。因为您使用的是Eclipse,所以这很容易完成:首先在Servers视图中添加Tomcat,然后将您的WebApp项目与集成的Tomcat示例相关联。这样,Eclipse会自动将特定于服务器的库添加到项目的构建路径中。在一个全新的Web项目上,您可以在项目创建向导期间选择服务器。对于已有的Web项目,您可以在项目属性的目标运行时部分中对其进行修改。

另请参阅:

deyfvvtc

deyfvvtc2#

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

fcy6dtqo

fcy6dtqo3#

旧线,但仍能帮助别人。我看到我在测试范围附带的依赖项中有一个javax-Servlet JAR。我到了规定的范围内。如果您使用的是Eclipse+Maven,请检查依赖关系图。

8yoxcaq7

8yoxcaq74#

在为Tomcat 9构建的WAR文件中错误地使用Tomcat 10 Docker镜像时,我得到了这个错误。我使用的Docker镜像没有随最新的Tomcat(在我的例子中是10)(tomcat:jdk17-temurin)一起提供的特定标签。
使用Tomcat 10需要进行调整,因为Tomcat 10 doc states
Tomcat 9.0.x和Tomcat 10.0.x之间有一个重大的突破性变化。规范API使用的Java包已从javax...去雅加达..。有必要根据新的API重新编译Web应用程序。
在我的例子中,我只是通过指定具有特定Tomcat版本(例如,tomcat:9.0.56-jdk17-temurin)的图像来解决该错误。

pw9qyyiw

pw9qyyiw5#

从JRE/lib或JRE/lib/ext中删除任何Servlet-api.jar或Upload Help JARCommons。这帮助我解决了问题。

exdqitrt

exdqitrt6#

我也有同样的问题。我遇到这个问题的原因是,因为我使用的是Jakarta-Servlet-API,所以我假设我需要的类在一个Jakarta包中。但是,当我解压缩API时,我看到包被称为javax,所以我改为导入了javax.servlet.HTTP.HttpServlet,它运行得很好。

wi3ka0sx

wi3ka0sx7#

在使用Tomcat 9的Gentoo Linux上,出于在Eclipse上开发Java EE应用程序的目的,当我尝试从Eclipse的Java EE透视图上的服务器窗口启动服务器时,我会收到以下错误消息。我尝试手动将/usr/share/tomcat-servlet-api-4.0/lib/servlet-api.jar添加到我的项目的类路径中,但不起作用。我尝试手动将该文件添加到/usr/share/tomcat-9/package.env上的CLASSPATH变量中,但不起作用。
在多次尝试解决这个问题都没有成功之后,我的直觉告诉我,也许Porage发行版应该作为一个独立的守护进程运行,该守护进程从Shell而不是从Eclipse管理,并且出于开发目的,我可能必须安装一个普通的Tomcat示例。因此,我从官方网页上手动下载Tomcat 9,并手动将其解压缩;我使用的是/opt/apache/tomcat/tomcat9,但理论上任何目录都可以。我做到了,Tomcat终于成功启动了。
如果您在Gentoo上开发Java EE应用程序,请不要使用Porage发行版,而应从官方网站下载并手动安装。

相关问题