← 解説「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 や MakefileMaven | 置き場所と手順が規約。依存を取ってくる手元では: 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)と versionMaven 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行が自分のプロジェクトので、版に の印が付いています。下の強調行がで、この依存はテストのときだけ使うという指定です。依存に版が書かれていない理由は後のレッスンで扱います。
...<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 の雛形)。
# 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 のスコープ | いつ使うか(Maven の文書の説明から)Gradle: 役割が近い語compile | 既定。何も書かなければこれプロジェクトのすべてのクラスパスで使えるGradle: implementationprovided | compile に近いが、実行時は JDK かコンテナが用意してくれる前提のもの例: Servlet の API(置き先の Tomcat が持っている)Gradle: compileOnlyruntime | コンパイルには要らず、実行に要るものGradle: runtimeOnlytest | 通常の利用には要らず、テストのコンパイルと実行のときだけ使うものGradle: testImplementation
5たとえが当たらない点: npm との違い
pom.xml は package.json、Maven Central は npm のレジストリ、と置き換えると読みやすくなりますが、そのまま当てはめると外れる点があります。特に、依存の実体がプロジェクトの中に無いことは、node_modules を探しても見つからない理由になります。
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 は同じ版番号のまま、中身が変わりうる