17

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

メソッドサーブレットを呼び出すと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 で開発しており、ファイル アップロード ライブラリをクラスパスにインポートしました。

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

私は絶望的です!!

4

5 に答える 5

14

これは、サーバー固有のライブラリを webapp/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 を使用しているため、これは簡単に行うことができます。最初にサーバービューに Tomcat を追加してから、Web アプリケーション プロジェクトを統合された Tomcat インスタンスに関連付けます。このようにして、Eclipse はサーバー固有のライブラリをプロジェクトのビルドパスに自動的に追加します。真新しい Web プロジェクトでは、プロジェクト作成ウィザードでサーバーを選択できます。既存の Web プロジェクトでは、プロジェクトのプロパティの[対象のランタイム]セクションで変更できます。

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

于 2010-05-23T16:27:21.233 に答える
8

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

于 2010-05-23T16:48:02.853 に答える
1

Tomcat 9 用の WAR ファイル ビルドに Tomcat 10 Docker イメージを誤って使用すると、そのエラーが発生しました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

于 2022-01-18T18:29:51.690 に答える