JDK と JRE の全体像
Java を動かすには「実行環境」と「開発のための道具」が必要です。ここで登場するのが JRE(Java Runtime Environment)と JDK(Java Development Kit)です。シンプルに言うと、JRE は「Java を動かすための土台」、JDK は「Java を作って動かすための工具一式」。初心者はまず JDK を入れておけば安心で、JDK の中に JRE 相当の実行環境が含まれます。
近年は多くの配布で「JRE 単体」を提供しないことが増え、JDK を入れてそれを実行環境としても使うのが一般的です。つまり「迷ったら JDK」を選べば、作る・動かす・配布するまで一通り可能です。
JRE(Java 実行環境)の役割
JRE は Java プログラムを「実行するためだけ」に必要なミニマム一式です。プログラムをコンパイルしたり、コードを書くためのツールは含みません。
JRE の中身(イメージ)
- JVM: バイトコードを実際に動かすエンジン。OS に合わせて最適化された実行機械。
- 標準クラスライブラリ:
java.*やjavax.*などの基本 API。入出力やネットワーク、コレクションなど。 - 補助ファイル: セキュリティポリシー、証明書ストア、ローカライズ用リソースなど。
使いどころ(初心者向けの理解)
- 用途: 既に作られた Java アプリを「動かす」だけなら JRE で十分。
- 限界:
javac(コンパイラ)やjarsignerなどの開発ツールは入っていない。ソースからビルドはできない。
JDK(Java 開発キット)の役割
JDK は「開発者が使うフルセット」。JRE 相当の実行環境に加え、コードを作る・検査する・配布するためのツール群が入っています。
JDK の主な構成
- javac: ソースコード(
.java)をバイトコード(.class)へコンパイルするコンパイラ。 - java: バイトコードを実行するランチャー。内部で JVM を起動する。
- jar: 複数の
.classやリソースをひとまとめにして.jarを作る。 - javadoc: ソースから API ドキュメントを生成する。
- jshell: 対話式で Java を試せる REPL。学習や実験に便利。
- その他ツール:
jlink(軽量ランタイム作成)、jdeps(依存関係解析)、jpackage(配布用パッケージ化)など。
使いどころ(初心者向けの結論)
- 結論: 学び始めるなら必ず JDK。書く、コンパイルする、実行する、配るまで全部できる。
- ポイント: JDK を入れておけば JRE は別途用意しなくていい(JDK に含まれるため)。
重要ポイントの深掘り
JVM とバイトコード(なぜ「どこでも動く」のか)
- 仕組み: Java ソースは
javacで「バイトコード」に変換されます。バイトコードは OS 非依存で、各環境の JVM が解釈・最適化して動かします。 - 利点: 同じ
.classや.jarを Windows・macOS・Linux・Android(派生)などで再コンパイルなしに実行可能。 - 最適化: JVM には JIT(Just-In-Time)コンパイルがあり、実行中にネイティブコードへ変換して高速化します。
JDK と JRE の関係(現代的な見方)
- 歴史的には: JRE は「実行専用」、JDK は「開発 + 実行」。
- 現在は: 実運用で JDK を実行環境として使うことが一般的。JRE 単体がない配布も多く、JDK を入れれば問題なし。
- 実務のコツ: 開発者は JDK、ユーザー向け配布は「必要なランタイムを同梱」するか、JDK/JRE 同等のランタイムを用意する。
クラスパスとモジュール(つまずきやすい要所)
- クラスパス:
javaやjavacに「どこにクラスやライブラリがあるか」を教える検索パス。-cpまたはCLASSPATHで指定。 - モジュール: Java 9 以降のモジュールシステム(
module-info.java)。大型プロジェクトで依存を明確化。最初はクラスパスで十分、必要になったらモジュールを学ぶ。
例題で理解する JDK と JRE の違い
例題 1: 最小のプログラムを作って実行(JDK が必要)
// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, JDK!");
}
}
コンパイルと実行(ターミナル/コマンドプロンプト):
javac Hello.java # ソース → Hello.class(バイトコード)
java Hello # Hello.class を JVM で実行
要点: javac は JDK にしか入っていない。ソースから作るなら JDK が必須。実行だけならバイトコードさえあれば JRE(または JDK 内のランタイム)で動く。
例題 2: ライブラリを使う時のクラスパス指定
// App.java
import org.example.lib.Utils;
public class App {
public static void main(String[] args) {
System.out.println(Utils.greet("Java"));
}
}
コンパイルと実行(外部ライブラリ lib/example-lib.jar を使う):
javac -cp lib/example-lib.jar App.java
java -cp .:lib/example-lib.jar App
要点: クラスパスに「現在ディレクトリ(.)」とライブラリの .jar を通す。Windows は区切りが ;、Unix 系は :。クラスパスが通っていないと ClassNotFoundException になる。
例題 3: 配布用に JAR を作る(JDK のツールを使う)
# マニフェストにエントリポイント(Main-Class)を記述
echo "Main-Class: Hello" > MANIFEST.MF
# クラスファイルを JAR に固める
jar cfm hello.jar MANIFEST.MF Hello.class
# 実行(JRE 相当の環境で OK)
java -jar hello.jar
要点: jar ツールで配布形態を整える。ユーザーは java -jar で実行できる。JDK のツールは開発・配布時に強力。
インストールと最初のセットアップの指針
何を入れるか
- 初心者は JDK 一択: OpenJDK またはベンダー配布(Temurin/Oracle/他)。LTS(長期サポート)のバージョンを選ぶと安定。
- JRE は不要: 実行環境は JDK に同梱されているため、学習・開発では JDK だけで十分。
どう確認するか
- バージョン確認:
java -versionとjavac -versionが両方通ればセットアップ成功。 - PATH の設定:
javaとjavacのあるディレクトリが PATH に入っていること。通っていないと「コマンドが見つからない」状態になる。
躓いた時のチェックポイント
- 拡張子とファイル名: クラス名とファイル名は基本一致(
public class Hello→Hello.java)。 - 作業ディレクトリ:
java Helloは「Hello.class があるカレントディレクトリ」で実行する。 - クラスパス: 外部 JAR を使う場合は
-cp指定を忘れない。
学習のロードマップ(JDK と JRE を踏まえて)
最初の 3 ステップ
- 環境確認:
java -versionjavac -versionが動くまで整える(JDK)。 - 基本構文の習得: 変数・型・条件分岐・ループ・メソッド・クラス。
- ビルドと配布:
javac→ 実行 →jar化 →java -jar実行までひと通り回す。
次に進むポイント
- 外部ライブラリ: クラスパスに通して使えるようにする(後でビルドツール Gradle/Maven を学ぶ)。
- モジュールやパッケージング: プロジェクトが大きくなってきたら依存管理と配布の最適化を考える。
- JShell の活用: 小さなコード片を即試す。理解が早くなる。
まとめの一言(要点を凝縮)
- JRE は実行専用、JDK は開発フルセット。初心者は JDK を選べば全部できる。
- JVM はバイトコードをどこでも動かす心臓部。クラスパスの理解がつまずき防止の鍵。
javac(コンパイル)→java(実行)→jar(配布)を回せるようになると、一気に自立できる。
