45

Mavenで定義された依存関係を使用してアプリケーションを実行しようとすると、例外が発生しますClassNotFoundExceptionNoClassDefFoundError

pom.xml次の宣言を使用して、問題のjarのMaven依存関係をファイルに追加しました。

<dependency>
    <groupId>spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.8.4</version>
    <scope>provided</scope>
</dependency>

これにより、関連するJARファイルがEclipseのMavenDependenciesフォルダーに追加されました。コードでクラスにアクセスできますが、アプリケーションを実行すると、上記の例外が発生します。

jarは、Maven依存関係の下のJavaビルドパスで参照されます。

Javaビルドパス

ローカルのMavenリポジトリがクラスパスに追加されます。

スクリーンショット

アプリケーションを実行しようとすると、次の2つの例外が発生します。

java.lang.NoClassDefFoundError: Lnet/spy/memcached/MemcachedClient;

java.lang.ClassNotFoundException: net.spy.memcached.MemcachedClient

誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

37

providedに変更compile

提供された

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

于 2012-10-10T03:08:14.833 に答える
10
<scope>provided</scope>

「提供された」スコープは、依存関係がコンパイルフェーズ中にのみ利用可能であり、実行時に他の場所で利用可能であり、Mavenが現在のアプリケーションの残りのjarおよびクラスとそれらをパッケージ化してはならないことを意味します。

あなたの依存関係は「提供された」範囲ではないようです。そのスコープを依存関係定義から削除すると、jarはパッケージ化されたjar / war/earに存在します。

于 2012-10-10T03:08:34.460 に答える
1

私は同じ問題に直面していましたが、POM でタグが定義されていませんでした。ある日突然理由もなくローカル マシンでそのエラーが発生し始めるまで、常に正常に動作していました。依存関係は正しく設定されていました。 POM にあり、jar はローカルの Maven リポジトリに存在していました。

プロジェクトのクリーニングとmavenプロジェクトの更新を試みましたが、他の投稿で提案された他の解決策はどれもうまくいきませんでした。

サーバータブに移動して最終的に解決できました-> Tomcat v8.0を右クリック->展開場所を参照

これにより、次のような一時フォルダーが表示されます

.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps

次に、プロジェクトフォルダーを参照します-> WEB-INF-> lib->ここで、エラーを発生させていたライブラリのjarが見つからないことがわかったので、.m2\repositoryからコピーしました

サーバーを再起動すると、通常どおりに機能し始めました。

これが同じ問題に直面している体に役立つことを願っています。

于 2017-04-21T10:52:27.923 に答える
0

あなたの問題に多少関連する回答ですが、それでも他の人を助けることができます。
私の場合、依存関係に追加<scope>compile</scope>するだけでは不十分でした。<packaging>jar</packaging>ターゲット モジュールの pomにも追加する必要がありました。

于 2019-02-06T13:57:23.310 に答える