Mavenでライブラリの競合を確認する方法
掲載日:2021年1月20日
INFOMARTION > Mavenでライブラリの競合を確認する方法
概要
Mavenでライブラリが競合しているか確認する方法です。Mavenはjarライブラリの依存関係を自動で解決してくれますが、デフォルトの設定だと競合までは知らせてくれません。そういった時にMavenでライブラリの競合を調べる方法です。
目次
- Mavenでライブラリの競合が発生した場合
- 確認方法
- 2-1. プラグインの導入
- 2-2. ビルド前にコマンドによる確認を行う
- まとめ
1. Mavenでライブラリの競合が発生した場合
MavenはJavaのライブラリの依存関係を自動で解決してくれます。依存関係を自動で解決するとは、必要なJarファイルがあった場合、そのJarを動かすために必要なJarを自動で取得してくれます。具体的なライブラリの依存関係の解決の仕組みについては以下の記事を参考にしてみてください。
Mavenがjarライブラリの依存性を自動解決する仕組みとは
しかし、ライブラリの競合が発生した場合は、自動で解決してくれません。さらに言うと、設定を入れていないと競合していることすら検知ができません。ライブラリの競合の確認方法について記載したいと思います。
2. 確認方法
ライブラリの競合を確認するための方法として大きく分けると以下の2つあります。
- プラグインの導入
- ビルド前にコマンドによる確認を行う
「プラグインの導入」はpom.xmlに設定を追記する方法。「ビルド前にコマンドによる確認を行う」は文字通りビルド前にコマンドで手動で確認します。具体的なやり方について説明したいと思います。
2-1. プラグインの導入
以下のMavenのサイトが参考となります。
http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html
以下の設定をpom.xmlに追記しましょう。
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<dependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
...
</project>
上記の設定を入れると以下の様なエラーが発生し、ビルド時にライブラリが競合しているとビルドが失敗します。
[WARNING]
Dependency convergence error for org.apache.commons:commons-collections4:4.1 paths to dependency are:
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
+-org.apache.poi:poi:3.17
+-org.apache.commons:commons-collections4:4.1
and
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
+-org.apache.commons:commons-collections4:4.0
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability. See above detailed error message.
プラグインを入れない状態でビルドをかけるとエラーが発生せず、正常終了します。競合を検知したい場合は設定を必ずいれましょう。
2-2. ビルド前にコマンドによる確認を行う
依存関係を以下のコマンドにより確認します。
mvn dependency:tree -Dverbose
コマンドを実行して、競合している場合は「omitted for conflict」が表示されます。以下のコマンドの様に競合個所のみ絞り込みをして出力することも可能です。※「find」はWindowsの場合のコマンドとなります。Linuxの場合は「grep」となります。
mvn dependency:tree -Dverbose | find "omitted for conflict"
上記のコマンドの実行結果を見ることによりライブラリの競合を確認できます。
3. まとめ
ライブラリの競合を確実に検知したい場合は「プラグインの導入」をおすすめします。プラグインを導入することにより、競合が発生している場合はビルドが失敗するので、確実に気付くことができます。
最後までご覧いただきありがとうございました。