複数のファイルのコンテンツを含むマルチパートリクエストを受信するサーブレットを開発しています。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で開発していて、ファイルアップロードライブラリをクラスパスにインポートしました。
どのように機能しないのですか?
私は絶望的です!!
これは、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セクションで変更できます。
Commons-fileupload.jarをJRE/lib/ext
、JRE/lib/endorsed
に誤ってコピーしたか、サーブレットAPIを認識できないクラスパスに配置した可能性があります。 -verbose:class
を使用してJVMを起動します。これにより、ServletFileUpload
クラスをロードしたクラスパスが出力されます。クラスがWEB-INF/lib
以外からロードされている場合は、削除する必要があります。
古いスレッドですが、それでも誰かを助けることができます。テストスコープに含まれている依存関係にjavax-servlet jarがあることがわかりました。支給範囲内にしました。 Eclipse + Mavenを使用している場合は、依存関係グラフを確認してください。
JRE/libまたはJRE/lib/extからservlet-api.jarまたはアップロード支援jar commonsを削除します。これは私が問題を修正するのに役立ちました。