jarがロードされていません サーブレット仕様2.3、セクション9.7.2を参照してください。問題のあるクラス:javax / servlet / Servlet.class


100

私は動的WebプロジェクトでもあるMavenプロジェクトを実行しています。MavenですべてのSpringライブラリを使用しました。を作成しましたweb.xmlが、Tomcat 7サーバーを起動すると、次のメッセージが表示されます。

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

からサーブレットを削除しようとしましたwebapp/libが、機能しませんでした。私のケースで何をすべきかを教えてください。


この動作はサーブレットの仕様に従っていることに注意してください。完全に理解することは、遭遇する可能性のあるよりトリッキーな問題を理解するのに役立ちます。
–ThorbjørnRavn Andersen 2015

回答:


113

明らかに、コンテナーはクラスパスにこれらのクラスを既に持っているため、サーブレットAPIの.jarファイルをWebアプリケーション内に埋め込むことはできません。このjarに含まれるインターフェースを実装します。

依存関係は、Maven pomのprovidedデフォルトのcompileスコープではなく、スコープ内にある必要があります。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

「依存関係は、Maven pomのデフォルトのコンパイルスコープではなく、提供されたスコープにある必要があります。」どうすればよいですか
dreambigcoder 2013年

私の編集した答えを見てください。Mavenを使用してアプリをクリーンアップしてビルドし、サーブレットjarが生成されたwebappのWEB-INF / libディレクトリにないことを確認します。
JB Nizet 2013年

私はすべてをしました。まだ私はWEB-INF / libディレクトリでjarを見つけています。jarを削除すると、次のメッセージが表示されますINFO:サーブレットエンジンの開始:Apache Tomcat / 7.0.12何か必要なことはありますか?
dreambigcoder 2013年

6
おそらく、別のバージョンのサーブレットjarへの推移的な依存関係がある依存関係がある可能性があります。mvn dependency:treeを使用して、このサーブレットjarのソースを見つけ、除外を追加します。
JBニゼット2013年

アイビーに同じことをするには?
Dinesh Babu KG

21

この警告メッセージは、サーブレットAPI jarファイルがすでにコンテナにロードされており、libディレクトリからもう一度ロードしようとしたときに表示されます。

サーブレットの仕様によると、webapps ディレクトリにservlet.jarを含めることはできませんlib

  • ディレクトリservlet.jarから削除するだけで、警告メッセージを取り除くことができますlib
  • libディレクトリにjarが見つからない場合は、ビルドパスをスキャンしてjarを削除します。

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Mavenプロジェクトを実行している場合は、コンテナー自体がサーブレットjarをすでに提供しているため、javax.servlet-api依存関係をprovidedpom.xmlのスコープに変更します。


4

これを修正するには、スコープprovidedに設定します。これにより、Mavenはコードservlet-api.jarをコンパイルとテストのみに使用し、WARファイルには含めないようになります。デプロイされたコンテナは、実行時にservlet-api.jarを「提供」します。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

2

次のWindowsコマンドラインは、問題のjarファイルを追跡するのに役立ちます。フォルダー内のすべてのjarにあるすべてのクラスファイルのインデックスを作成します。デプロイされたアプリのlibフォルダー内から実行し、index.txtファイルで問題のクラスを検索します。

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Maven依存関係スコープ

provided:これはコンパイルによく似ていますJDKまたはコンテナが実行時に依存関係を提供することを期待していることを示してます。たとえば、Java Enterprise EditionのWebアプリケーションを構築する場合、Webコンテナがこれらのクラスを提供するためサーブレット APIおよび関連するJava EE APIへの依存関係を提供されたスコープに設定ます。このスコープは、コンパイルとテストのクラスパスでのみ使用でき、推移的ではありません。


1

私はこの問題に苦労しており、数多くの「解決策」を試してきました。

しかし、結局のところ、機能し、実際にそれが実行されるまでに数秒かかったのは、新しいサーバーインスタンスを削除して追加し直すことでした。

基本的に、Eclipseの[サーバー]の下にあるTomcatサーバーを右クリックして削除しました。次に、新しいTomcatサーバーを追加しました。アプリケーションをクリーンアップして再デプロイすると、このエラーは解消されました。


サーバーを右クリック->クリーン...次にサーバーを右クリック->クリーンなtomcat作業ディレクトリで修正されました
kiltek

0

次のディレクトリ内でjarファイルel-api.jar:C:\ apache-tomcat-7.0.39 \ lib \ el-api.jarを確認します。存在する場合は、WebアプリケーションのこのディレクトリWEB-INF \ lib \にあります。 el-api.jar jarを削除する必要があります


0

URLパターンが間違っていると、このエラーが発生する可能性があります。

例えば。@WebServlet( "login")と書いた場合、このエラーが表示されます。正しいものは@WebServlet( "/ login")です。


0

除外とprovided依存関係は子プロジェクトでは機能しません。

Mavenプロジェクトで継承を使用している場合、この構成を親pom.xmlファイルに含める必要あります。あなたは持っているでしょう<parent>...</parent>、あなたののpom.xmlにセクションを使用すると、継承を使用している場合。だからあなたはあなたの親にこのようなものを持っているでしょうpom.xml

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

0

JAX-WS依存ライブラリ「jaxws-rt.jar」がありません。

ここhttp://jax-ws.java.net/にアクセスしてください。JAX-WS RIディストリビューションをダウンロードしてください。それを解凍し、「jaxws-rt.jar」をTomcatライブラリフォルダ「{$ TOMCAT} / lib」にコピーします。Tomcatを再起動します。


0

通常、このメッセージが表示された場合、問題はありません。それが言うなら

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

これは、tomcatがすでにそのjarの組み込みバージョンを持っているので、servlet-api-2.5.jarを無視していることを意味します。したがって、それはあなたのjarを使用しないことになります。通常、これは問題を引き起こしません。

もしそれが言うなら WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

次に、あなたができること(私の例では、それは影付きのjarです)が実行されます

$ mvn dependency:tree

そして、servlet-apiまたはそれに似たjar(例:)であるjarに依存する「何か」への推移的な依存関係があることを発見しますtomcat-servlet-api-9.0.0。だからあなたのpomにex:の除外を追加してください:(私の場合、tomcat、あなたの場合、おそらく他の回答で言及されたものです):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.