Mavenの依存関係ツリー – 競合の解決
Mavenの依存関係ツリーは、プロジェクトの依存関係を理解するためや、異なるバージョンの依存関係による衝突を解消するために非常に役立ちます。
プロジェクトのMaven依存関係ツリーを取得する方法
ターミナルでmvn dependency:treeコマンドを実行して、プロジェクトの依存関係ツリーを出力することができます。この例では、Mockitoチュートリアルプロジェクトを使用します。GitHubリポジトリからプロジェクトをダウンロードすることができます。私たちはプロジェクトの依存関係のみに興味があります。pom.xmlには以下のプロジェクトの依存関係が宣言されています。
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.19.0</version>
<scope>test</scope>
</dependency>
<!-- TestNG Dependencies -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
「Mavenの依存関係ツリーコマンドを実行して、出力を確認しましょう。」
$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.scdev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] | +- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] | | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] | \- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] | \- org.mockito:mockito-core:jar:2.19.0:test
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] | \- org.objenesis:objenesis:jar:2.6:test
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO] +- com.beust:jcommander:jar:1.72:test
[INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.871 s
[INFO] Finished at: 2019-12-13T12:24:11+05:30
[INFO] ------------------------------------------------------------------------
$
このアプリケーションの実行に使用されているすべてのJARが出力されます。出力には、依存関係のgroupId、artifactId、packaging、version、およびscopeが表示されます。
マベンプロジェクトの依存関係から特定の依存関係を除外する。
上記の依存関係ツリーの出力を見ると、JUnit 4 JARはjunit-platform-runnerの直接の依存関係として取り込まれています。もしテストケースの作成にJUnit 5を使用する予定がある場合、衝突を避けるためにJUnit 4を依存関係から除外することが良いアイデアです。exclusionsタグを使用してプロジェクトの依存関係からJUnit 4 JARを除外することができます。これは、それを取り込む責任がある依存関係に追加する必要があります。
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.2.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
もう一度依存性ツリーコマンドを実行しましょう。今はJUnit 4のJARが表示されないはずです。
Mavenの依存関係ツリーの詳細モードを使用して、衝突を解決する方法。
Mavenプロジェクトをビルドする際、プロジェクトに近い依存バージョンが選択されます。ただし、特定のバージョンを希望している場合でも、他のバージョンがMavenによって選択されることがあります。mvn dependency:tree -Dverboseコマンドを使用すると、依存関係の競合を表示することができます。このコマンドを利用すると、JARファイルとの互換性の問題を特定するのに役立ちます。
$ mvn dependency:tree -Dverbose
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.scdev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] | | \- (org.junit.platform:junit-platform-engine:jar:1.2.0:test - omitted for duplicate)
[INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] | \- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] | | +- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
[INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] | +- (org.opentest4j:opentest4j:jar:1.1.0:test - omitted for duplicate)
[INFO] | \- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] | +- org.mockito:mockito-core:jar:2.19.0:test
[INFO] | | +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] | | \- org.objenesis:objenesis:jar:2.6:test
[INFO] | \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO] +- com.beust:jcommander:jar:1.72:test
[INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.018 s
[INFO] Finished at: 2019-12-13T12:58:07+05:30
[INFO] ------------------------------------------------------------------------
$
出力行(org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test – 5.2.0との競合のため省略)は、このJARのバージョンが別のバージョンに置き換えられたことを示しています。junit-jupiter-apiバージョン5.1.0を使用したい場合は、プロジェクトのMaven依存関係に追加してください。Mavenは最も近いバージョンが優先される戦略でバージョンの競合を解決するため、直接の依存関係は常にプロジェクトに含まれます。
Mavenの依存関係ツリーをフィルタリングする。
もしMavenプロジェクトに多くの依存関係がある場合、特定のアーティファクトを探すのが困難になります。
-Dとは含まれています
出力から特定の依存関係のみを含めるために、-Dincludesオプションを使用することができます。フィルタリングパターンの構文は[groupId]:[artifactId]:[type]:[version]です。各パターンセグメントはオプションであり、完全または部分的な*ワイルドカードをサポートしています。
$ mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-api
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.scdev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] \- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.981 s
[INFO] Finished at: 2019-12-13T13:04:04+05:30
[INFO] ------------------------------------------------------------------------
$
– 除外する (Dexcludes)
これは、依存関係ツリーの出力から指定された依存関係を削除するために使用されます。パターンは、-Dincludesオプションと同じです。複数のパターンを含めるか除外するためには、カンマを使用することができます。
$ mvn dependency:tree -Dexcludes=org.junit.jupiter:junit-jupiter-api
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.scdev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] | \- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] | \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] | \- org.mockito:mockito-core:jar:2.19.0:test
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] | \- org.objenesis:objenesis:jar:2.6:test
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO] +- com.beust:jcommander:jar:1.72:test
[INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.925 s
[INFO] Finished at: 2019-12-13T13:55:22+05:30
[INFO] ------------------------------------------------------------------------
$
Eclipse IDEにおけるMavenの依存関係ツリー
Eclipseのpom.xmlの「Dependency Hierarchy」タブには、プロジェクトの依存関係ツリーが表示されます。左側には詳細な出力が表示され、右側には解決された依存関係が表示されます。特定の依存関係を検索するためには、「フィルタ」オプションを使用することができます。
その他の参考文献:Eclipse IDEでMavenを使用する
ファイルに依存関係ツリーを保存する
依存構造木の出力ファイルを指定するために、-DoutputFileオプションを使用することができます。
$ mvn dependency:tree -DoutputFile=dependency-tree.txt
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] Wrote dependency tree to: /Users/scdev/Desktop/maven-examples/Mockito-Examples/dependency-tree.txt
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.862 s
[INFO] Finished at: 2019-12-13T15:27:51+05:30
[INFO] ------------------------------------------------------------------------
$
$ cat dependency-tree.txt
com.scdev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
+- org.junit.platform:junit-platform-runner:jar:1.2.0:test
| +- org.apiguardian:apiguardian-api:jar:1.0.0:test
| +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
| \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
| \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
+- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
| +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
| | \- org.opentest4j:opentest4j:jar:1.1.0:test
| \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
+- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
| \- org.mockito:mockito-core:jar:2.19.0:test
| +- net.bytebuddy:byte-buddy:jar:1.8.10:test
| +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
| \- org.objenesis:objenesis:jar:2.6:test
\- org.testng:testng:jar:6.14.3:test
+- com.beust:jcommander:jar:1.72:test
\- org.apache-extras.beanshell:bsh:jar:2.0b6:test
$
参考文献
- Maven Dependency Plugin
- Resolving conflicts using the dependency tree
- Filtering the dependency tree