Dev Study
← Spring コース

12. ソースから起動まで: 全体の流れ

の雛形をそのままビルドすると、は というファイル1個になり、 の1行で起動します。JAR は、コンパイル結果をまとめた zip 形式のファイルです。このレッスンでは、ソースから HTTP の応答が返るまでを1枚の図で通します。このセクションは先に全体の地図を渡し、個々の部品の細部は後のレッスンで扱います。

NestJS に当てはめると、 が package.json、 が tsc、 が dist/、java -jar が node dist/main.js に当たります。 は nest build に近く、コンパイルに加えてテストの実行と成果物づくりまでを1回で行います。どちらも OS が起動するのはランタイム( や node)で、成果物はその入力です。

対応しない点が3つあります。javac が出すのは JavaScript のようなソースではなく、(Java のプログラムを動かすプログラム)向けの命令列であるです。の実体はプロジェクトの中ではなく、ホームディレクトリの に全プロジェクト共有で置かれます。そして Spring Boot は依存を JAR の中に同梱するので、node_modules に当たるものを別に運びません。

点線の付いた語はタップすると説明が出ます。用語集を開く →

ソースから HTTP 応答まで(右の → は NestJS で当たるもの)
ソースsrc/main/java の .java 2個と、src/main/resources の設定1個
NestJS: src/ の .ts
pom.xml依存とビルドの定義
NestJS: package.json
./mvnw package(中で javac が動く)
target/classes/.class 2個と設定1個
NestJS: nest build で dist/
JAR にまとめ、依存の JAR 34本を中に入れる
target/demo-0.0.1-SNAPSHOT.jar成果物はこの1個。約 19.9 MB
NestJS: dist/ と node_modules を運ぶ
java -jar target/demo-0.0.1-SNAPSHOT.jar
JVM が JAR を読んで実行するJAR の中の Tomcat がポート 8080 を開く
NestJS: node dist/main.js
curl http://localhost:8080/hello
HTTP 200Hello from Spring Boot
  • ・start.spring.io(nest new に当たる、雛形を作る公式サイト)が作る Maven の雛形(Spring Boot 4.1.1)に、下の HelloController を1つ足しただけのアプリを、JDK 25(Temurin 25.0.4.1)と arm64 の Docker で動かした実物です
  • ・Spring Framework は Spring の本体のライブラリ群で、Spring Boot はその上に乗り、少ない設定で作って JAR 1個で動かせるようにするものです。このコースで単に Spring と書くときは両方を指します
  • ・Spring Boot を使わない構成や、Spring Boot でも設定を変えた場合は、成果物が WAR というファイルになり、別に用意した Tomcat に置いて動かします。この道はこのセクションの「ant を実行すると何が起きるか」と「Ant で Spring の WAR を作る」で扱います
  • ・mvnw は、決まった版の Maven を取ってきて実行するスクリプトです。Maven は npm に当たるツールですが JDK には入っていないので、雛形がこのスクリプトを持っています
  • ・Tomcat は HTTP を受け付けるサーバです。Spring Boot では別に用意するのではなく、依存の JAR の1つとして成果物の中に入っています
  • ・依存を JAR の中に入れるのは Spring Boot のプラグインの仕事です。同じ target/ に残る demo-0.0.1-SNAPSHOT.jar.original(3,176 B)が同梱前の JAR で、自分のクラス2個と設定だけが入っています
  • ・依存の置き場所 ~/.m2/repository には、同じライブラリの複数の版が並んで入ります

サンプルコード(フレームワーク環境が必要なため表示のみ)

// src/main/java/com/example/demo/HelloController.java
// 雛形に足したのはこの1ファイルだけ。main は雛形の DemoApplication.java にある
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

	// GET /hello に来たリクエストに、この文字列を返す
	@GetMapping("/hello")
	public String hello() {
		return "Hello from Spring Boot";
	}

}

// ビルドして起動し、curl で呼んだ結果(Spring Boot 4.1.1 / JDK 25)
//   $ ./mvnw package
//   $ java -jar target/demo-0.0.1-SNAPSHOT.jar
//   $ curl -i http://localhost:8080/hello
//   HTTP/1.1 200
//   Content-Type: text/plain;charset=UTF-8
//   Content-Length: 22
//
//   Hello from Spring Boot

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

サンプルコードで身につける(5本) →

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

公式ドキュメントで詳しく ↗