1前書き

MavenはJavaエコシステムで最も人気のあるビルドツールの1つであり、その中心的な機能の1つは依存関係管理です。

この記事では、Mavenプロジェクトで推移的な依存関係を管理するのに役立つメカニズム、つまり依存範囲について説明し、探求します。


2推移的な依存関係

  • 簡単に言うと、Mavenには2種類の依存関係があります。direct



    transitiveです。

直接の依存関係は、プロジェクトに明示的に含まれているものです。これらは

<dependency>

タグを使用してプロジェクトに含めることができます。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

  • 一方、推移的な依存関係は、私たちの直接の依存関係によって必要とされる依存関係です。

:mvn dependency:treeコマンドを使用して、プロジェクト内の推移的な依存関係を含むすべての依存関係を一覧表示できます。


3依存範囲

依存範囲は、依存関係の推移性を制限するのに役立ちます。また、依存範囲はさまざまな構築タスクのクラスパスを変更します。 ** Mavenには6つのデフォルトの依存関係スコープがあります。

そして、

import

を除く各スコープが推移的な依存関係に影響を与えることを理解することが重要です。


3.1. コンパイル

他のスコープが指定されていない場合は、これがデフォルトのスコープです。

この範囲の依存関係は、すべてのビルドタスクでプロジェクトのクラスパスで利用でき、それらは依存プロジェクトに伝播されます。

さらに重要なことに、これらの依存関係も推移的です。

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>


3.2. 提供された

このスコープは、実行時にJDKまたはコンテナによって提供される必要がある依存性、したがって名前を示すために使用されます。

このスコープの良い使用例は、コンテナがすでにライブラリ自体を提供しているコンテナにデプロイされたWebアプリケーションです。

たとえば、実行時にサーブレットAPIをすでに提供しているWebサーバー、つまりこのプロジェクトでは、これらの依存関係は

provided

スコープで定義できます。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>


provided

依存関係はコンパイル時とプロジェクトのテストクラスパスでのみ利用可能です。さらに、彼らは他動詞ではありません。


3.3. ランタイム

  • このスコープとの依存関係は実行時に必要です** が、プロジェクトコードのコンパイルには必要ありません。そのため、

    runtime

    スコープでマークされた依存関係はランタイムクラスパスとテストクラスパスに存在しますが、コンパイルクラスパスには存在しません。

ランタイムスコープを使用する必要がある依存関係の良い例は、JDBCドライバです。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
    <scope>runtime</scope>
</dependency>


3.4. テスト

このスコープは、依存関係がアプリケーションの標準の実行時に必要ではないことを示すために使用されますが、テスト目的でのみ使用されます。

テスト依存関係は推移的ではなく、テストおよび実行クラスパスにのみ存在します。

このスコープの標準的な使用例は、JUnitのようなテストライブラリをアプリケーションに追加することです。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>


3.5. システム


  • System

    スコープは

    provided

    スコープとよく似ています** これら2つのスコープの主な違いは

    system

    はシステム上の特定のjarを直接指す必要があるということです。

念頭に置いておくべき重要なことは、

system

スコープの依存関係を使用してプロジェクトをビルドすると、依存関係が存在しない場合や

systemPath

が指定した場所と異なる場所に配置されている場合、別のコンピューターで失敗することです。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>custom-dependency</artifactId>
    <version>1.3.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/custom-dependency-1.3.2.jar</systemPath>
</dependency>


3.6. インポート

このスコープはMaven 2.0.9で追加され、

依存型

pom

でのみ利用可能です。

依存型については今後の記事で詳しく説明します。


Import

は、この依存関係をPOMで宣言されているすべての有効な依存関係に置き換える必要があることを示します。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>custom-project</artifactId>
    <version>1.3.2</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>


4範囲と推移性

各依存範囲は、それ自体の方法で推移的な依存関係に影響します。

これはつまり、異なる推移的な依存関係が異なるスコープを持つプロジェクトになる可能性があるということです。

ただし、スコープが

provided

および

test

の依存関係は、メインプロジェクトには含まれません。

その後:


  • compile

    スコープの場合、

    runtime scope

    のすべての依存関係は

プロジェクトとすべての依存関係で

runtime

スコープで引き込まれる

compile

スコープでは

compile

スコープで引き込まれます。
プロジェクト
**

provided

スコープでは、

runtime



compile

の両方のスコープ

プロジェクトでは、依存関係は

provided

スコープで引き込まれます。
**

test

スコープでは、

runtime



compile

の両方のスコープ推移的

プロジェクトでは、依存関係は

test

スコープで引き込まれます。
**

runtime

スコープの場合、

runtime

スコープと

compile

スコープの両方が推移的

プロジェクトでは、依存関係は

runtime

スコープで引き込まれます。


5結論

このクイックチュートリアルでは、Mavenの依存関係スコープ、その目的、およびそれらの動作方法の詳細に焦点を当てました。

Mavenをさらに深く掘り下げたい場合は、https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html[文書化]を始めるのに最適な場所です。