← Spring コース
30. Maven: 依存解決(推移依存・nearest wins・dependencyManagement・exclusions・スコープ)
に2本しか書いていないのに72本の依存が並ぶのは、依存の に書かれた依存を が自動でたどるからです()。 雛形の は深さが最大5でした。同じライブラリの別の版に2つの経路で出会うと、根に近い方が選ばれます。古い 3.12.0 を直接書き、別の依存が 3.20.0 を要求する最小の pom では、直接書いた 3.12.0 が勝ちました。
依存を宣言せずに版だけ決める仕組みが です。直接の宣言を消すと、書いていない 3.20.0 が乗ります。そこに 3.21.0 と書くと推移依存の版が置き換わります。pom.xml を読んだ回の 1,911 本はこの表です。 は枝を切ります。は乗せると推移の範囲を決めるもので、数え方は文書で違います(6つ、または5つ)。
npm との対応は までです。package-lock.json に当たるファイルは雛形に無く、この雛形では pom・親・依存先の POM に固定の数字で書かれた版が使われます( と版の範囲指定は別です)。実体は にどおりの場所で置かれます。 はこの雛形では2本を「未使用」と言うので、そのまま直してはいけません。
点線の付いた語はタップすると説明が出ます。用語集を開く →
pom.xml(nearest)直接の依存: commons-lang3 3.12.0 と commons-text 1.15.0。版は固定の数字で書く
package.json の dependencies に当たる。lockfile に当たるファイルは雛形に無い深さ1(直接書いたもの)
commons-lang3 3.12.0根に近いので、この版が選ばれる
commons-text 1.15.0この POM が commons-lang3 3.20.0 を要求している
深さ2(commons-text の POM から推移的に)
(commons-lang3 3.20.0 - omitted for conflict with 3.12.0)新しいが、根から遠いので使われない。-Dverbose を付けないと表示もされない
同じ木を3通りに変えると
直接の宣言を消す3.20.0 がそのまま乗る(自分で書いていない版)
dependencyManagement に 3.21.03.21.0 (version managed from 3.20.0)。Boot の BOM はこれの大きなもの
commons-text に exclusions枝が消え、残るのは直接の 3.12.0 だけ
- 規則の原文: Maven picks the “nearest definition”。同じ深さなら先に書いた方が勝つ(Introduction to the Dependency Mechanism)
- この最小例では 3.12.0 が選ばれても commons-text 1.15.0 は動いた(Hello From Commons-text)。古い版が選ばれれば常に動く、とは言えない。確認できたのは「選ばれる」こと
- スコープ: compile(既定。全クラスパス)/ provided(コンパイルとテストのみ。実行環境が持つ)/ runtime(実行とテストのみ)/ test(テストのみ。推移しない)/ system(ローカルのパスを指す)。import だけは dependencyManagement の中で BOM を取り込む指定で、クラスパスの区別ではない。Dependency Mechanism は6つ、POM Reference は five と数え、用語の回では主な4つを扱った
- optional: 依存先が optional と印を付けた依存は、こちらには来ない(原文の言い方では excluded by default)。exclusions が使う側で切るのに対し、optional は提供する側が印を付ける
- Boot 雛形の -Dverbose では omitted for conflict が0、version managed from が129。版の衝突は BOM が先に吸収している(Boot 4.1.1 web 雛形の値)
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Java
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗