web-dev-qa-db-ja.com

Tomcatの起動時にClassNotFoundException DispatcherServlet(Mavenの依存関係がwtpwebappsにコピーされない)

私はこの問題に数回遭遇し、(半)信頼できる解決策に出くわしただけなので、誰かに役立つ場合、または私がそれを忘れた場合に備えて、ここに投稿し、誰かに尋ねるかもしれないと思った根本的な原因が何であるか、そして私の修正が機能する理由は何ですか?.

問題-Eclipseの[サーバーで実行]オプションを使用してTomcat 7サーバーで実行するSpring 3 Webアプリケーションがあります。一部のプロジェクトではこれは正常に機能しますが、サーバーが起動するたびにorg.springframework.web.servlet.DispatcherServletというクラスが見つからないという、壊れた状態になるプロジェクトもあります。

調査の結果、プロジェクトのMaven依存関係がWEB-INF/lib${PROJECT_LOCATION}/.metadata/.plugins/org.Eclipse.wst.server.core/tmp0/wtpwebapps/にコピーされていないことがわかりました

多くのことを試してから、プロジェクトの[問題]パネルに警告が表示されることにようやく気付きました。

Classpath entry org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result.

おそらく、もっと早く気づいたはずです。

とにかく、これを選択して「クイックフィックス」を実行すると問題が修正され、プロジェクトを楽しく実行できます。簡単な修正は、「関連する生のクラスパスエントリを発行/エクスポートの依存関係としてマークする」ことです。

問題は、これはうまくいきますが、どういう意味かわかりません。完了後、プロジェクト構成に明らかな変更が見られません。私は実際の問題が何であるか、そして私がそれが再び起こるのを避けることができるかどうかを知りたいです。また、他のほとんどすべてを試したような気がするので、自分で(クイックフィックスを実行する以外に)修正できる何かがあるかどうかも知りたいです。

ご協力いただきありがとうございます。

25
Russell

プロジェクトのプロパティの下にある「展開アセンブリ」セクションを見てください。このページのコンテンツでは、プロジェクトを実行中のアプリケーションに組み込む方法を指定します。特に、プロジェクトが参照するライブラリをパッケージ化する場所を制御できる場所です。 [追加]-> Javaビルドパスエントリを選択します。既存のビルドパスエントリの中から選択して、アセンブリに含めることができます。

あなたが見つけたクイックフィックスはあなたのために同じことをしました。何が起こっているのか知りたくない場合は、クイックフィックスの前後に.classpathファイルを確認してください。クイックフィックスは、クラスパスエントリにいくつかのアセンブリ情報をタグ付けします。

.classファイルを確認し、次のエントリを置き換えます

**<classpathentry kind="con" path="org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER" />**

以下で:-

**<classpathentry kind="con" path="org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER">
  <attributes>
    <attribute name="org.Eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
  </attributes>
</classpathentry>**

それは私のために働いた。

2
Muskan

Maven Integration for WTP プラグインを追加でインストールする必要があるようです。その説明は issues.sonatype.org にあります。

1

長い間働いてきたプロジェクトで、今日この問題に遭遇しました。上記の解決策をすべて試しましたが、(1)ポスターのように問題パネルに警告が表示されませんでした。 (2)私のデプロイメントアセンブリJavaビルドパスエントリにはデプロイできる他のものが表示されませんでした;(3)org.Eclipse.jst.component.dependencyの.classpathエントリはすでにそこにありました;そして(4)すでにMaven Integration for WTPをインストールしているので、最終的にプロジェクトをTomcatサーバーから削除して再デプロイすると、問題は解消しました。

0
mojoken