Maven-manage-dependencies
Maven-依存関係の管理
Mavenのコア機能の1つは、依存関係管理です。 マルチモジュールプロジェクト(数百のモジュール/サブプロジェクトで構成される)を処理する必要がある場合、依存関係の管理は難しいタスクです。 Mavenは、このようなシナリオを管理するための高度な制御を提供します。
推移的な依存関係の発見
ライブラリ(Aなど)が他のライブラリ(Bなど)に依存している場合がよくあります。 別のプロジェクトCがAを使用する場合、そのプロジェクトはライブラリBも使用する必要があります。
Mavenは、このような要件を回避して、必要なすべてのライブラリーを検出するのに役立ちます。 Mavenは、依存関係のプロジェクトファイル(pom.xml)を読み取り、依存関係などを把握することでこれを行います。
各プロジェクトpomで直接依存関係を定義するだけです。 Mavenは残りを自動的に処理します。
推移的な依存関係により、含まれるライブラリのグラフは急速に大きく成長します。 ライブラリが重複している場合に発生する可能性があります。 Mavenは、推移的な依存関係の範囲を制御する機能をほとんど提供しません。
Sr.No. | Feature & Description |
---|---|
1 |
Dependency mediation 成果物の複数のバージョンが検出された場合に使用される依存関係のバージョンを決定します。 2つの依存関係バージョンが依存関係ツリーの同じ深さにある場合、最初に宣言された依存関係が使用されます。 |
2 |
Dependency management 推移的な依存関係で発生したときに使用する成果物のバージョンを直接指定します。 たとえば、プロジェクトCは、依存関係管理セクションにBを依存関係として含め、参照されるときに使用するBのバージョンを直接制御できます。 |
3 |
Dependency scope ビルドの現在のステージごとの依存関係が含まれます。 |
4 |
Excluded dependencies 「exclusion」要素を使用して、推移的な依存関係を除外できます。 例として、AはBに依存し、BはCに依存し、AはCを除外としてマークできます。 |
5 |
Optional dependencies 任意の推移的な依存関係は、「optional」要素を使用してオプションとしてマークできます。 例として、AはBに依存し、BはCに依存します。 これで、BはCをオプションとしてマークしました。 この場合、AはCを使用しません。 |
依存関係の範囲
以下に説明するように、さまざまな依存関係スコープを使用して、推移的な依存関係の検出を制限できます。
Sr.No. | Scope & Description |
---|---|
1 |
compile このスコープは、プロジェクトのクラスパスで依存関係が利用可能であることを示します。 これはデフォルトのスコープです。 |
2 |
provided このスコープは、実行時にJDKまたはweb-server/containerによって依存関係が提供されることを示します。 |
3 |
runtime このスコープは、コンパイルに依存関係は必要ないが、実行中に必要であることを示します。 |
4 |
test このスコープは、依存関係がテストのコンパイルおよび実行フェーズでのみ利用可能であることを示しています。 |
5 |
system このスコープは、システムパスを提供する必要があることを示します。 |
6 |
import このスコープは、依存関係のタイプがpomの場合にのみ使用されます。 このスコープは、指定されたPOMをそのPOMの<dependencyManagement>セクションの依存関係に置き換える必要があることを示します。 |
依存関係管理
通常、共通のプロジェクトの下に一連のプロジェクトがあります。 このような場合、すべての共通の依存関係を持つ共通のPOMを作成し、このPOMをサブプロジェクトのPOMの親にすることができます。 次の例は、この概念を理解するのに役立ちます。
以下は、上記の依存関係グラフの詳細です-
App-UI-WARはApp-Core-libおよびApp-Data-libに依存しています。
ルートはApp-Core-libおよびApp-Data-libの親です。
ルートは、Lib1、lib2、Lib3を依存関係セクションの依存関係として定義します。
*App-UI-WAR*
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-UI-WAR</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
*App-Core-lib*
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
*App-Data-lib*
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
ルート
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname1</groupId>
<artifactId>Lib1</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname2</groupId>
<artifactId>Lib2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3</groupId>
<artifactId>Lib3</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
App-UI-WARプロジェクトをビルドすると、Mavenは依存関係グラフを走査してアプリケーションをビルドすることにより、すべての依存関係を検出します。
上記の例から、次の重要な概念を学ぶことができます-
*親pomの概念を使用して、共通の依存関係を1か所に配置できます。* App-Data-lib *および *App-Core-lib* プロジェクトの依存関係は、_Root_プロジェクトにリストされています(ルートのパッケージ化タイプを参照してください。 POMです)。
* App-UI-WARの依存関係としてLib1、lib2、Lib3を指定する必要はありません。 Mavenは *Transitive Dependency Mechanism* を使用してこのような詳細を管理します。