Mavenが依存関係を自動解決する仕組み|推移的依存とリポジトリ
掲載日:
更新日:
INFORMATION > Mavenが依存関係を自動解決する仕組み|推移的依存とリポジトリ
結論:MavenはPOMに宣言した直接依存のPOMをたどり、必要な推移的依存をリモートリポジトリから取得してローカルへ保存します。
この記事の対象と位置付け:ライブラリを1つ追加すると複数のJARが取得される理由と、Maven Central・ローカルリポジトリの役割を知りたい方向けです。
2026年時点の注意:本文のApache POI 3.17と画面は当時の例です。現在は公式プロジェクトとMaven Centralで版を確認し、再現性が必要な通常ビルドでは変化し得るSNAPSHOT依存を避けてください。
概要
Mavenを使うと自動でjarをインターネットからダウンロードしてくれますが、具体的にどういた仕組みでインターネットからダウンロードしているか説明したいと思います。
この記事の前提として、Mavenとは何なのかを理解している必要があるので、Maven自体にあまり詳しくない人は以下の記事も参考にしてみてください。
目次
1. Mavenがjarライブラリの依存性を解決する機能について
Mavenはpom.xmlファイルに必要なjarファイルを定義するだけで、自動でjarファイルの取得が可能です。また、そのjarを動かすために必要な依存するjarも自動で習得してくれます。どういった仕組みで動作しているのか説明したいと思います。
1-1. pom.xmlファイルに記載する内容
まず、jarライブラリの依存性を解決するために、pom.xmlファイルに情報を記載します。Mavenはpom.xmlファイルの情報を元に処理を行います。「poi-3.17.jar」が必要な場合を例にとると、以下の様にpom.xmlに記載します。(ちなみに「poi-3.17.jar」ExcelなどのMicrosoft Officeのファイルを操作する時に使用するjarです。)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
上記の通りに記載するだけで、「poi-3.17.jar」をインターネットからダウンロードして、かつ、「poi-3.17.jar」を動かすために必要な付随するjarもインターネットからダウンロードしてくれます。
1-2. どの様な仕組みでインターネットからダウンロードしているのか
簡単に説明すると以下の図の様な仕組みとなります。
インターネット上に公開されているMavenのレポジトリからダウンロードします。何も設定しない場合のデフォルト値はCentral Repositoryとなります。URLだと「https://repo1.maven.org/maven2/」となります。以下のサイトにインターネット上に公開されているレポジトリが記載されているので気になる人はみてください。
https://maven.apache.org/repositories/index.html
初回は外部のレポジトリにjarを取りにいきますが、ローカルレポジトリにコピーされるので2回目以降は取得しにいかない仕組みとなります。ローカルレポジトリの場所は「C:\Users\user\.m2」となります。
デフォルト値から取得先を変更したい場合は以下のrepositoryタグをpom.xmlに記載すると取得先の変更も可能です。
<repositories>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
</snapshots>
</repository>
</repositories>
1-3. 取得するjarの依存性を解決する仕組み
先ほど「poi-3.17.jar」を取得する例を記載しましたが、「poi-3.17.jar」は動かすために「commons-collections4-4.1.jar」が必要となります。つまり、「poi-3.17.jar」は「commons-collections4-4.1.jar」に依存しています。この依存関係を解決する仕組みは「poi-3.17.jar」が格納されているMavenのレポジトリを見ると分かります。以下のURLとなります。
https://repo1.maven.org/maven2/org/apache/poi/poi/3.17/
「poi-3.17.pom」が格納されていると思いますが、このファイルの中に「poi-3.17.jar」は「commons-collections4-4.1.jar」に依存しているという情報が記載されています。つまり、「poi-3.17.jar」を取得する時にjarファイルを取得するだけでなく、pomファイルも取得し、他に必要なjarファイルがないかチェックする仕組みとなっています。
2. まとめ
Mavenはjarライブラリの依存性を解決する仕組みとして、取得するjarファイルの格納先のpomファイルに依存性が定義されています。
最後までご覧いただきありがとうございました。
