繁体   English   中英

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

[英]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 项目,并且我在类路径中导入了文件上传库。

它怎么不起作用?

我很绝望!!

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

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

也可以看看:

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

旧线程但仍然可以帮助某人。 我看到我在测试范围中包含的依赖项中有一个 javax-servlet jar。 我做到了提供的范围。 如果您使用的是 Eclipse +Maven,请检查依赖关系图。

当我错误地将 Tomcat 10 Docker 映像用于为 Tomcat 9 构建的 WAR 文件时,我遇到了该错误。我使用了一个没有特定标记的 Docker 映像,该标记随最新的 Tomcat(在我的情况下为 10)( tomcat:jdk17-temurin )一起提供。

正如Tomcat 10 文档所述,使用 Tomcat 10 需要进行调整:

Tomcat 9.0.x 和 Tomcat 10.0.x 之间有一个重大的突破性变化。 规范 API 使用的 Java 包已从 javax... 更改为 jakarta.... 有必要针对新的 API 重新编译 Web 应用程序。

就我而言,我只是通过指定具有特定 Tomcat 版本(例如tomcat:9.0.56-jdk17-temurin )的图像来解决该错误。

从 JRE/lib 或 JRE/lib/ext 中删除任何 servlet-api.jar 或上传帮助 jar commons 这帮助我解决了这个问题。

我有同样的问题。 我遇到这个问题的原因是因为我使用的是 jakarta-servlet-api 我假设我需要的类在一个 jakarta 包中。 但是,当我提取 api 时,我看到包名为 javax,因此我导入了 javax.servlet.http.HttpServlet,它运行良好。

在 Gentoo Linux 上,使用 Tomcat 9,为了在 Eclipse 上开发 Java EE 应用程序,在 Eclipse 的 8837438959532 上尝试从服务器 window 启动服务器时会收到此错误消息。 我尝试手动将/usr/share/tomcat-servlet-api-4.0/lib/servlet-api.jar添加到我的项目的类路径中,但没有用。 我尝试将该文件手动添加到/usr/share/tomcat-9/package.env上的 CLASSPATH 变量,但没有用。

在多次尝试修复该问题失败后,我的直觉告诉我,也许 Portage 发行版应该作为一个独立的守护进程运行,由 shell 而不是 Eclipse 管理,并且也许出于开发目的,我必须安装一个普通的 vanilla 实例Tomcat。于是去官方web页面手动下载Tomcat 9,手动解压; 我使用了/opt/apache/tomcat/tomcat9 ,但理论上任何目录都可以。 我就是这样做的,Tomcat终于启动成功了。

tl;dr:如果您在 Gentoo 上开发 Java EE 应用程序,请不要使用 Portage 发行版,而是从官方 web 站点手动下载并安装它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM