Dev Study
← Spring コース

15. ツール無しで手でビルドする

が無くても、 に入っている3つのコマンドでビルドできます。 out でソースを にし、 で にまとめ、 で起動します。 は、ソース先頭の (が属する名前空間の名前。後のレッスンで扱います)どおりのフォルダを out の下に作ります。jar は、入口のクラス名を JAR の中の設定ファイル()に書き込みます。

外部のライブラリを使うと手間が増えます。JAR を自分でダウンロードして lib に置き、コンパイル時にも実行時にも (。クラスを探す場所の一覧)に書きます。npm install がやってくれる作業を人がやる形です。( の本体。 はこの上に乗ります)を 無しで動かしたときは、依存の一覧を手で辿って9本の JAR を集めました。

困るのは、JAR が足りないことにコンパイルで気づけるとは限らない点です。コンパイラが型を調べるときに必要になる JAR は、無ければコンパイルが失敗します。しかし Spring の内部だけが使う JAR は、無くてもコンパイルが通り、実行して初めてクラスが見つからずに落ちます。、Maven、 といったビルドツールが肩代わりしているのは、この手作業の一部または全部です。

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

JDK のコマンド3つで、ソースから実行まで
src/com/example/app/Main.javapackage com.example.app;
src/com/example/greet/Greeter.javapackage com.example.greet;
javac -d out(コンパイル)
out/com/example/…/*.classpackage どおりの階層に .class が2個
jar --create --file app.jar --main-class com.example.app.Main -C out .
app.jar1,800 B。.class 2個とマニフェスト
java -jar app.jar
出力: Hello, world!
  • ・JDK 25(Temurin 25.0.4.1)での実行です。コマンドと出力の全文はサンプル集にあります
  • ・依存の JAR は自分の app.jar には入りません。マニフェストに何も足していないこの app.jar では、java -jar app.jar は失敗し、java -cp app.jar:lib/… のように並べて入口のクラスを名指しすると動きました。マニフェストに Class-Path という行で JAR の場所を書けば java -jar でも動きますが、JAR を別のファイルとして置いておく点は変わりません
  • ・Spring の9本は、spring-context 7.0.9 が公開している依存の一覧(POM)を手で辿ったものです。1本ずつ抜いて試すと(各1回)、コンパイルが失敗したのは3本、コンパイルは通って実行で落ちたのが3本、抜いても動いたのが3本でした。動いた3本も不要とは言えません。エラーが起きた経路や Web アプリでは必要になりました
  • ・Spring Boot 4.1.1 の最小の Web アプリの成果物には、依存の JAR が 34本入っていました。これを手で集めて -cp に書く代わりに、ビルドツールが集めて組み立てます

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

// ファイル1: src/com/example/greet/Greeter.java
package com.example.greet;

public class Greeter {
    public String greet(String name) {
        return "Hello, " + name + "!";
    }
}

// ファイル2: src/com/example/app/Main.java
package com.example.app;

import com.example.greet.Greeter;

public class Main {
    public static void main(String[] args) {
        System.out.println(new Greeter().greet("world"));
    }
}

// この2ファイルを JDK のコマンドだけでビルドして動かす(JDK 25 での実行結果)
//   $ javac -d out $(find src -name "*.java")
//       -> out/com/example/app/Main.class と out/com/example/greet/Greeter.class ができる
//   $ jar --create --file app.jar --main-class com.example.app.Main -C out .
//       -> app.jar ができる
//   $ java -jar app.jar
//   Hello, world!

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

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

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

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