簡體   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