web-dev-qa-db-ja.com

Java.lang.NoClassDefFoundErrorが原因でコードを実行できない:com / fasterxml / jackson / annotation / JsonMerge

Intellij Idea 2018コミュニティエディションにいくつかのテストコードがあり、複数のpomファイルがあります。 testng注釈付きテストを実行すると、「テストが見つかりませんでした」というエラーが表示されます。問題は例外スタックトレースのこの部分が原因であるようです:

Java.lang.NoClassDefFoundError:com/fasterxml/jackson/annotation/JsonMerge

私は解決策を探してこれを見つけました- https://github.com/FasterXML/jackson-annotations/issues/119 そしてこれ https://stackoverflow.com/a/4640607 。この問題は、プロジェクトにこれらのjarの同じバージョンがない場合に発生するようです。

1)ジャクソンコア(2.8.8)

2)jackson-databind(2.9.2)

3)ジャクソン注釈(2.8.5)

ご覧のとおり、すべてのjarに同じバージョンがあるわけではありません。私はプロジェクトのすべてのpomを調べましたが、これらの依存関係がすべて追加される場所は見つかりませんでした。そこに単にバージョン番号を設定したいと思っていました。親pomファイルにすべての依存関係を追加するだけですか、それとも何か他のことをする必要がありますか?

プロジェクトに影響を与えずにこの問題を解決するにはどうすればよいですか?これらのjarが同じバージョンでない理由を知るにはどうすればよいですか?

13
MasterJoe2

ほとんどの場合、異なる依存関係をサブ依存関係としてインポートした異なるバージョンがあります。

Mavenに、完全な依存関係ツリーを提供するいわゆる「有効なpom」を表示させ、そこから何が含まれているかを確認できます。

一部のIDE(IntelliJなど)には、これをグラフィカルに表示するオプションがあります。これにより、このような競合を非常に簡単に見つけることができます。

以前のバージョンを除外し、必要に応じて新しいバージョンに明示的に依存関係を追加します。

6
jwenting

お探しのキーワードは「依存除外」です。 Mavenには推移的な依存関係が自動的に含まれます。まず、依存関係の原因を特定する必要があります。

次のように生成されたtree.txtファイルで「jackson」を検索すると、出力をファイルにリダイレクトして詳細に分析できます。

mvn dependency:tree -Dverbose > tree.txt

次のステップは、いくつかのライブラリをアップグレードして、適切なバージョンのjacksonライブラリを自動的に使用できるようにするかどうかを確認することです。

最後に、推移的な依存関係を明示的に除外する場合は、特定の<exclusions>内で<dependency>タグを使用して、クラスパスに追加された特定のサードパーティの依存関係を除外できます。たとえば、これを参照してください SO質問

5
Jaywalker