Dev Study
← 解説「Ant・Maven・Gradle・pom.xml・依存・Maven Central」に戻る

サンプルコードで身につける: Ant・Maven・Gradle・pom.xml・依存・Maven Central

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1用語早見表: ビルドツールと依存

このレッスンの用語を1つずつ並べた表です。「近いもの」はたとえで、 や npm の公式文書が互いを対応づけているわけではありません。当たらない点は5本目にまとめました。

用語早見表(ビルドツール・依存・置き場)表
用語 | 一言で
手元では: 何として見えるか
近いもの: Node / NestJS で近いもの
 
ビルドツール | コンパイルから JAR 作りまでを順に実行する道具
手元では: ant / mvn / gradle というコマンド
近いもの: npm と scripts(tsc、nest build)
 
Ant | 手順を build.xml に全部書く。依存は取ってこない
手元では: build.xml と、JAR を人が置いた lib/
近いもの: 手順を自分で書いた npm scripts や Makefile
 
Maven | 置き場所と手順が規約。依存を取ってくる
手元では: pom.xml、src/main/java、target/
近いもの: npm(ただし JDK には入っていない)
 
Gradle | Maven と同じ配置と公開の置き場を使い、
設定をスクリプトで書く
手元では: build.gradle、gradlew、build/
近いもの: npm(同じく JDK には入っていない)
 
pom.xml(POM) | Maven のプロジェクト定義
POM は Project Object Model の略
手元では: プロジェクト直下の XML ファイル
近いもの: package.json(scripts に当たる欄は無い)
 
依存 | 自分のコードがビルドや実行に使うライブラリ
手元では: pom.xml の dependency 要素
近いもの: package.json の dependencies
 
座標 | groupId:artifactId:version の3つ組。JAR の住所
手元では: org.apache.commons:commons-lang3:3.21.0
近いもの: パッケージ名(@scope/name)と version
 
Maven Central | 既定の公開リポジトリ(JAR の置き場)
手元では: https://repo.maven.apache.org/maven2
近いもの: npm の公開レジストリ
 
ローカルリポジトリ | 取ってきた JAR を溜める手元の置き場
手元では: ~/.m2/repository(全プロジェクト共用)
近いもの: node_modules ではない。キャッシュに近い
 
スコープ | その依存をいつ使うかの区分
compile / provided / runtime / test など
npm の @scope/name のスコープとは、名前が同じだけで別物
手元では: dependency の中の <scope>test</scope>
近いもの: test が devDependencies に近い
 
SNAPSHOT | 開発中でまだ確定していない版の印
手元では: 0.0.1-SNAPSHOT
近いもの: -beta.1 のような確定前の版
 
ラッパー | 決まった版の Maven / Gradle を
取ってきて実行するスクリプト
手元では: mvnw、gradlew(Windows 用は .cmd / .bat)
近いもの: Corepack(置き場所は違う。次の回で)
 
target/ と build/ | ビルドの出力先
手元では: target/ は Maven、build/ は Gradle の既定
近いもの: dist/
 
target(Ant の語) | build.xml の中の、手順のまとまり1つ
Maven の出力フォルダ target/ とは、名前が同じだけで別物
手元では: <target name="compile" ...> という要素
近いもの: 無い
 
アーティファクト | ビルドで出来る、または依存として使うファイル
手元では: 多くは JAR
近いもの: JAR については npm パッケージ

2pom.xml の中で、座標・SNAPSHOT・スコープを探す

(雛形を作る公式サイト)が作った の抜粋です。強調した上の3行が自分のプロジェクトので、版に の印が付いています。下の強調行がで、この依存はテストのときだけ使うという指定です。依存に版が書かれていない理由は後のレッスンで扱います。

pom.xml(Spring Boot 4.1.1 の雛形から抜粋。... は省略)設定ファイル
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
...

3依存を使うと書く場所を、3つの道具で並べる

は の置き場所を指すだけで、JAR 自体は人が に置きます。Maven は座標の3行を書き、 は取りに行く先()と座標を1行で書きます。Gradle の行に版が無いのは省いてあるためで、理由は後のレッスンで扱います。# で始まる行は補足で、Gradle の例だけ別のライブラリです(Ant と Maven は同じアプリ、Gradle は 4.1.1 の雛形)。

build.xml / pom.xml / build.gradle(それぞれ抜粋)設定ファイル
# Ant: build.xml(抜粋)。JAR は人が lib/ に置き、その場所を指すだけ
<property name="lib.dir" location="lib"/>
...
<path id="compile.classpath">
<fileset dir="${lib.dir}" includes="*.jar"/>
</path>
 
# Maven: pom.xml(抜粋)。座標を書くと Maven が取ってくる
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.21.0</version>
</dependency>
</dependencies>
 
# Gradle: build.gradle(抜粋)。取りに行く先と、座標を書く
repositories {
mavenCentral()
}
 
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
...
}

4スコープの4つを読む

スコープは、その依存をコンパイル・実行・テストのどこで使うかの区分です。Maven の文書の説明を日本語にし、Gradle で役割が近い語を添えました。 は、アプリを置く先のサーバが同じ JAR を持っているのでに入れない、という指定です。

Maven のスコープと、Gradle で役割が近い語表
Maven のスコープ | いつ使うか(Maven の文書の説明から)
Gradle: 役割が近い語
 
compile | 既定。何も書かなければこれ
プロジェクトのすべてのクラスパスで使える
Gradle: implementation
 
provided | compile に近いが、実行時は JDK かコンテナが
用意してくれる前提のもの
例: Servlet の API(置き先の Tomcat が持っている)
Gradle: compileOnly
 
runtime | コンパイルには要らず、実行に要るもの
Gradle: runtimeOnly
 
test | 通常の利用には要らず、テストのコンパイルと
実行のときだけ使うもの
Gradle: testImplementation

5たとえが当たらない点: npm との違い

pom.xml は package.json、Maven Central は npm のレジストリ、と置き換えると読みやすくなりますが、そのまま当てはめると外れる点があります。特に、依存の実体がプロジェクトの中に無いことは、node_modules を探しても見つからない理由になります。

Java のビルドの用語と Node の用語: 当たる点と当たらない点表
Maven / Gradle と npm
当たる点 : 依存を取ってきてビルドする
当たらない点: npm は Node に付いてくる。Maven / Gradle は
JDK に入っていないので、雛形がラッパーを持つ
Maven は手順を自分が持っていて、scripts に書かない
 
pom.xml と package.json
当たる点 : プロジェクトの名前・版・依存を書く
当たらない点: XML。親の POM を継承でき、依存の版を
書かないことがある。scripts に当たる欄は無い
 
~/.m2/repository と node_modules
当たる点 : 取ってきたものが手元に溜まる
当たらない点: プロジェクトの中に置かれない。全プロジェクト共用で、
同じライブラリの別の版が隣に並ぶ
 
Maven Central と npm の公開レジストリ
当たる点 : 既定の公開の置き場
当たらない点: 置かれるのはコンパイル済みの JAR と POM
 
スコープ test と devDependencies
当たる点 : 本番で要らない依存を分ける
当たらない点: provided(置き先のサーバが持っているので
成果物に入れない)に当たる区分は、Node には通常無い
 
SNAPSHOT と -beta.1 のような版
当たる点 : 確定前の版
当たらない点: SNAPSHOT は同じ版番号のまま、中身が変わりうる

図やコードに出てくる用語(タップで説明)