Maven依存関係スコープ
1. 前書き
MavenはJavaエコシステムで最も人気のあるビルドツールの1つであり、コア機能の1つは依存関係管理です。
この記事では、Mavenプロジェクトの推移的な依存関係の管理に役立つメカニズム(依存関係のスコープ)について説明し、調査します。
2. 推移的な依存関係
簡単に言えば、Mavendirectとtransitive.には2種類の依存関係があります
直接依存関係は、プロジェクトに明示的に含まれる依存関係です。 これらは、<dependency>タグを使用してプロジェクトに含めることができます。
junit
junit
4.12
Transitive dependencies, on the other hand, are dependencies required by our direct dependencies.必要な推移的な依存関係は、Mavenによってプロジェクトに自動的に含まれます。
mvn dependency:treeコマンドを使用して、プロジェクト内の推移的な依存関係を含むすべての依存関係を一覧表示できます。
3. 依存関係の範囲
依存関係スコープは、依存関係の推移性を制限するのに役立ち、さまざまなビルドタスクのクラスパスを変更します。 Maven has 6 default dependency scopes。
また、importを除く各スコープは、一時的な依存関係に影響を与えることを理解することが重要です。
3.1. コンパイル
これは、他のスコープが提供されていない場合のデフォルトのスコープです。
このスコープの依存関係は、すべてのビルドタスクでプロジェクトのクラスパスで利用でき、依存関係のあるプロジェクトに伝達されます。
さらに重要なことに、これらの依存関係も推移的です。
commons-lang
commons-lang
2.6
3.2. 提供
このスコープは、dependencies that should be provided at runtime by JDK or a containerをマークするために使用されるため、この名前が付けられています。
このスコープの適切な使用例は、コンテナがすでにライブラリを提供しているコンテナにデプロイされたWebアプリケーションです。
たとえば、実行時にサーブレットAPIをすでに提供しているWebサーバーであるため、このプロジェクトでは、これらの依存関係をprovidedスコープで定義できます。
javax.servlet
servlet-api
2.5
provided
providedの依存関係は、コンパイル時およびプロジェクトのテストクラスパスでのみ使用できます。さらに、それらは推移的ではありません。
3.3. ランタイム
The dependencies with this scope are required at runtimeですが、プロジェクトコードのコンパイルには必要ありません。 そのため、runtimeスコープでマークされた依存関係は、ランタイムおよびテストクラスパスに存在しますが、コンパイルクラスパスにはありません。
ランタイムスコープを使用する必要がある依存関係の良い例は、JDBCドライバーです。
mysql
mysql-connector-java
6.0.6
runtime
3.4. Test
このスコープは、アプリケーションの標準の実行時に依存関係が必要ないことを示すために使用されますが、テスト目的でのみ使用されます。 Test dependencies aren’t transitive and are only present for test and execution classpaths.
このスコープの標準的なユースケースは、JUnitなどのテストライブラリをアプリケーションに追加することです。
junit
junit
4.12
test
3.5. システム
System scope is much similar to the provided scope.これら2つのスコープの主な違いは、systemではシステム上の特定のjarを直接指す必要があることです。
覚えておくべき重要なことは、依存関係が存在しないか、systemPathが指す場所とは異なる場所にある場合、systemスコープの依存関係を使用してプロジェクトを構築すると、異なるマシンで失敗する可能性があることです。
com.example
custom-dependency
1.3.2
system
${project.basedir}/libs/custom-dependency-1.3.2.jar
3.6. インポート
このスコープはMaven2.0.9およびit’s only available for the dependency type pom.で追加されました。依存関係のタイプについては、今後の記事で詳しく説明します。
Importは、この依存関係を、そのPOMで宣言されているすべての有効な依存関係に置き換える必要があることを示します。
com.example
custom-project
1.3.2
pom
import
4. 範囲と推移性
各依存関係スコープは、推移的な依存関係に独自の方法で影響を与えます。 これは、異なる推移的な依存関係が、異なるスコープを持つプロジェクトで終わる可能性があることを意味します。
ただし、スコープprovidedおよびtestの依存関係は、メインプロジェクトに含まれることはありません。
その後:
-
compileスコープの場合、プロジェクトでは、runtime scopeのすべての依存関係がruntimeスコープでプルされ、compileスコープのすべての依存関係がプロジェクト内のcompileスコープ
-
providedスコープの場合、プロジェクトでは、runtimeスコープとcompileスコープの両方の依存関係がprovidedスコープに取り込まれます。
-
testスコープの場合、プロジェクトでは、runtimeスコープとcompileスコープの両方の推移的な依存関係がtestスコープに取り込まれます。
-
runtimeスコープの場合、プロジェクトでは、runtimeスコープとcompileスコープの両方の推移的な依存関係がruntimeスコープに取り込まれます。
5. 結論
このクイックチュートリアルでは、Maven依存関係スコープ、その目的、およびそれらの動作方法の詳細に焦点を当てました。
Mavenをさらに深く掘り下げたい場合は、documentationから始めるのが最適です。