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 Dependency Tree

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 Pom 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
コメントを残す 0

Your email address will not be published. Required fields are marked *