web-dev-qa-db-ja.com

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

複数のファイルのコンテンツを含むマルチパートリクエストを受信するサーブレットを開発しています。Apachecommonsファイルアップロードライブラリを使用しています。

parseRequest(request);を呼び出すと、メソッドサーブレットが次の例外をスローします。

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にあります

多分問題は次のようになると思います:このWebプロジェクトをEclipseで開発していて、ファイルアップロードライブラリをクラスパスにインポートしました。

どのように機能しないのですか?

私は絶望的です!!

14
pAkY88

これは、Webアプリケーションの/WEB-INF/libまたはおそらくJRE/libにサーバー固有のライブラリを配置した場合に発生する可能性があります。 Tomcatの/lib/servlet-api.jarをそこにコピーした大きな可能性があります。あなたはそれをするべきではありません。これはクラスパスで衝突を引き起こすだけで、この種のエラーを引き起こし、Webアプリケーションを移植不可能にします(つまり、Tomcatでのみ実行するように関連付けられています。Glassfish、JBoss AS、Websphereなどの別のサーバーでは実行できません。 、など)。サーバー固有のライブラリをデフォルトの場所に保持する必要があります。サーバー固有のライブラリから/WEB-INF/libをクリーンアップし、サードパーティのライブラリからJRE/libをクリーンアップします。

サーブレットをコンパイルできなかったため、サーバー固有のライブラリをそこにコピーした可能性があります。 /WEB-INF/libにライブラリをコピーするのは間違ったソリューションです。基本的には、コンパイル時のクラスパスでこれらのライブラリを指定するだけです。 Eclipseを使用しているため、これは簡単に行うことができます。最初にServersビューにTomcatを追加し、次にwebappプロジェクトを統合されたTomcatインスタンスに関連付けます。このようにして、Eclipseは自動的にサーバー固有のライブラリーをプロジェクトのビルドパスに追加します。新しいWebプロジェクトでは、プロジェクト作成ウィザードでサーバーを選択できます。既存のWebプロジェクトでは、プロジェクトのプロパティのTargeted Runtimesセクションで変更できます。

以下も参照してください。

14
BalusC

Commons-fileupload.jarをJRE/lib/extJRE/lib/endorsedに誤ってコピーしたか、サーブレットAPIを認識できないクラスパスに配置した可能性があります。 -verbose:classを使用してJVMを起動します。これにより、ServletFileUploadクラスをロードしたクラスパスが出力されます。クラスがWEB-INF/lib以外からロードされている場合は、削除する必要があります。

8
Brett Kail

古いスレッドですが、それでも誰かを助けることができます。テストスコープに含まれている依存関係にjavax-servlet jarがあることがわかりました。支給範囲内にしました。 Eclipse + Mavenを使用している場合は、依存関係グラフを確認してください。

0

JRE/libまたはJRE/lib/extからservlet-api.jarまたはアップロード支援jar commonsを削除します。これは私が問題を修正するのに役立ちました。

0