Maven依存関係バージョン衝突
Mavenの推移的依存関係でバージョンが衝突した場合に発生するエラー
概要
Mavenの依存関係バージョン衝突は、複数のライブラリが同じアーティファクトの異なるバージョンを要求する場合に発生します。ビルド時にはエラーにならず、実行時に NoSuchMethodError や ClassNotFoundException として現れることが多いです。
エラーメッセージ
java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap()
java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
[WARNING] Omitted dependency: com.google.guava:guava:jar:30.0-jre
managed from 31.1-jre
| |
原因
1. 推移的依存関係のバージョン不一致
ライブラリAがGuava 28を、ライブラリBがGuava 31を要求し、Mavenが古いバージョンを選択する場合があります。
2. dependencyManagementによるバージョン固定
親POMやdependencyManagementで古いバージョンに固定されている場合があります。
3. Mavenの最近勝ち(nearest wins)戦略
Mavenは依存関係ツリーで「最も近い」バージョンを選択します。これが意図しない古いバージョンになる場合があります。
解決策
1. 依存関係ツリーで衝突を確認
| |
2. dependencyManagementでバージョンを統一
| |
3. exclusionsで競合する依存関係を除外
| |
4. maven-enforcer-pluginでバージョン衝突を検出
| |
5. BOM(Bill of Materials)を使用
| |
デバッグ方法
| |
関連エラー
関連エラー
Java の他のエラー
この記事は役に立ちましたか?