web-dev-qa-db-ja.com

Java Maven依存関係のあるClassNotFoundException

Maven定義の依存関係を使用してアプリケーションを実行しようとすると、ClassNotFoundExceptionおよびNoClassDefFoundError例外が発生します。

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

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

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

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

Java build path

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

screenshot

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

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

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

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

37
Vex

providedcompileに変更します

提供

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

35
Jigar Joshi
<scope>provided</scope>

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

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

10
Vikdor

私は同じ問題に直面していましたが、POMで定義されたタグを持っていませんでしたが、ある日突然突然エラーがローカルマシンでエラーを与えて依存関係が正しく設定されるまで、それは常に正常に動作していましたPOMおよびjarはローカルのMavenリポジトリに存在していました。

私はプロジェクトをきれいにしてmavenプロジェクトを更新しようとしましたが、何もしませんでした。

私はついにサーバータブに行くことによってそれを解決することができました-> Tomcat v8.0を右クリック->展開場所を参照

これは、次のような一時フォルダにつながるはずです

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

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

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

これが、同じ問題に直面している身体の助けになることを願っています。

1
MFJ

以下の依存関係を追加すると、問題が解決します。

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-jvm-deps -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-jvm-deps</artifactId>
    <version>1.0.3</version>
    <scope>provided</scope>
</dependency>
0
Arpan Saini

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

0
adamjankovec