動的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
からサーブレットを削除しようとしましたが、うまくいきませんでした。私の場合に何をすべきか教えてください。
明らかに、コンテナのクラスパスにこれらのクラスが含まれているため、サーブレットAPIの.jarファイルをwebapp内に埋め込まないでください。このjarに含まれるインターフェースを実装します。
依存関係は、Maven pomのデフォルトのprovided
スコープではなく、compile
スコープ内にある必要があります。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
この警告メッセージは、サーブレットAPI jarファイルが既にコンテナーにロードされているときに、lib
ディレクトリーからもう一度ロードしようとすると表示されます。
サーブレットの仕様では、webapps
lib
ディレクトリにservlet.jarを含めることは許可されていません。
lib
ディレクトリからservlet.jar
を削除するだけで、警告メッセージを取り除きます。lib
ディレクトリにjarが見つからない場合は、ビルドパスをスキャンしてjarを削除します。C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib
Mavenプロジェクトを実行している場合、pom.xmlでjavax.servlet-api
依存関係をスコープprovided
に変更します。これは、コンテナーが既にサーブレットjar自体を提供しているためです。
修正するには、scopeを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>
問題のあるjarファイルを追跡するには、次のWindowsコマンドラインが役立つ場合があります。フォルダー内のすべてのjarにあるすべてのクラスファイルのインデックスを作成します。デプロイされたアプリのlibフォルダー内から実行し、index.txtファイルで問題のあるクラスを検索します。
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
provided:これはコンパイルによく似ていますが、expectJDKまたはa- container実行時に依存関係を提供します。たとえば、Java Enterprise Edition用のWebアプリケーションを構築する場合、ServletAPIおよび関連するJavaスコープのEE API 提供Webコンテナがこれらのクラスを提供するため。このスコープは、コンパイルおよびテストクラスパスでのみ使用でき、推移的ではありません。
私はこの問題に苦労してきました、そして、私は多くの「解決策」を試みました。
ただし、最後に機能したのは実際に数秒でした。新しいサーバーインスタンスを削除して追加し直す!
基本的に、Eclipseの[サーバー]でTomcatサーバーを右クリックして削除しました。次に、新しいTomcatサーバーを追加しました。アプリケーションをクリーンアップして再デプロイし、このエラーを取り除きました。
次のディレクトリ内でjarファイルel-api.jarを確認します。C:\ Apache-Tomcat-7.0.39\lib\el-api.jarが存在する場合は、WebアプリケーションWEB-INF\lib \のこのディレクトリに存在します。 el-api.jar jarを削除する必要があります
除外およびprovided
依存関係は子プロジェクトでは機能しません。
Mavenプロジェクトで継承を使用している場合、must親pom.xml
ファイルにこの構成を含めます。 pom.xmlに<parent>...</parent>
セクションがあります継承を使用している場合。したがって、親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>
通常、このメッセージが表示された場合、問題はありません。それが言うなら
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を無視しているので、あなたのものを使用することはありません。通常、これは問題を引き起こしません。
ただし、WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class
と表示される場合
その後、あなたができること(私のインスタンスでは、影付きのjarファイルです)が実行されます
$ mvn依存関係:ツリー
そして、サーブレットAPIまたはそれに類するもの(例:Tomcat-servlet-api-9.0.0
)のいずれかであるjarに依存する「何か」に推移的な依存関係があることを発見します。したがって、exに除外を追加します(例:私の場合、Tomcat、あなたの場合、おそらく他の回答で言及されたもの):
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.Apache.Tomcat</groupId>
<artifactId>Tomcat-servlet</artifactId>
</exclusion>
</exclusions>
</dependency>
uRLパターンが間違っていると、このエラーが発生する可能性があります。
例えば。 @WebServlet( "login")を作成した場合、このエラーが表示されます。正しいものは@WebServlet( "/ login")です。
JAX-WS依存ライブラリ「jaxws-rt.jar」がありません。
ここに行く http://jax-ws.Java.net/ JAX-WS RIディストリビューションをダウンロードします。解凍し、「jaxws-rt.jar」をTomcatライブラリフォルダー「{$ Tomcat}/lib」にコピーします。 Tomcatを再起動します。