5

最近、JMeter を使用して、自分の PC でローカルに Web アプリケーションの負荷テストを開始しました。画像をアップロードするためのjspページがあります。画像は私のサーブレットによって処理されます。今日プロセスを試したところ、次の例外/エラーが発生しました。

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    org.apache.commons.fileupload.servlet.ServletFileUpload.isMultipartContent(ServletFileUpload.java:68)
    spyder.servlets.imageProcessing.ImageProcessingServlet.uploadEditedImagesToDB(ImageProcessingServlet.java:527)
    spyder.servlets.imageProcessing.ImageProcessingServlet.doPost(ImageProcessingServlet.java:153)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

例外が参照しているサーブレットのコードは次のとおりです-

boolean isPart = ServletFileUpload.isMultipartContent(req);

....はい、必要なすべてのimportステートメントをクラスに入れました。

この問題の原因となる変更をシステムに加えた覚えがありません。このプロセスは常に問題なく実行されているため、何が原因でこのように失敗するのかわかりません。JMeterを使用してから失敗しているのは、かなり偶然だと思います...

4

2 に答える 2

11

Commons FileUpload などのすべてのサード パーティの Web アプリ ライブラリ/WEB-INF/libは、他の場所ではなく、Web アプリに属します。JRE/libこの例外は、またはに配置したときに発生する可能性がありますJRE/lib/ext

Tomcat/lib実際、Bozho が言及しているように、クラスパスのさまざまな場所で、サーブレットコンテナ固有のライブラリ (そのままにしておく必要があります) を移動/コピー/複製していないことも確認する必要があります。しかし、それは IMO がこの種の例外をもたらすべきではありませんでした。基本的に、FileUpload API をロードしたクラスローダは、サーブレット API についてまったく知識がないことを示しています。

Tomcat classloading HOW-TOを読むと、と のライブラリが( common ) と( webappJRE/lib ) のライブラリとJRE/lib/extは異なるクラスローダー ( bootstrap )によってロードされていることがわかります。ブートストラップ クラスローダーには、共通ライブラリと webapp ライブラリに関する知識がありません。それは逆です。共通クラスローダーにはブートストラップ クラスローダーに関する知識があり webappクラスローダーには両方に関する知識があります。通常、サーブレット API は共通クラスローダーによってロードされるため、これは、FileUpload API がブートストラップによってロードされたことを意味するだけです。Tomcat/lib/WEB-INF/libクラスローダー。そして、これは間違っています:)

于 2011-01-28T20:37:18.870 に答える
2

これは、サーブレット コンテナーにサーブレット API がないことを意味します。Tomcat をクリーン インストールして、そこにデプロイしてみてください。最初に、サーブレット API jar が にあることを確認しますtomcat/lib。そして、あなたがそれを持っていないことを確認してくださいwebapps/yourapp/WEB-INF/lib

于 2011-01-28T20:36:27.173 に答える