Javaのコンパイルを完全解説|javacの仕組み・クラスパス設定・エラー対策
CONTENTS
Javaの学習を始めると、必ず登場するのが「コンパイル」という工程です。EclipseやIntelliJ IDEAなどの統合開発環境(IDE)を使っていると、ボタン一つで実行できるため、裏側で何が起きているかを意識する機会は少ないかもしれません。
しかし、実務の現場ではIDEが使えないサーバー環境で作業したり、ビルドエラーの原因調査を行ったりする場面が多々あります。その際、javac コマンドやクラスパス(classpath)の知識がないと、単純なエラーで何時間も立ち止まってしまうことになります。
そこで本記事では、初心者がつまずきやすいポイントを体系的に整理し、Javaコンパイルの本質的な仕組みから、実務で役立つエラー対策までを分かりやすく解説します。
Javaコンパイルの仕組みを理解する
まず、Javaにおける「コンパイル」とは具体的に何をしているのでしょうか。結論から言えば、人間が読めるプログラム(ソースコード)を、コンピュータ(JVM)が理解できる形式に翻訳する作業のことです。
Javaの特徴である「Write Once, Run Anywhere(一度書けば、どこでも動く)」は、このコンパイルの仕組みによって支えられています。
ソースコードから実行までの流れ
Javaプログラムが動くまでの流れは、以下の3ステップで構成されています。
- ソースコード作成(.java)
人間がJava言語でプログラムを書きます - コンパイル(javac)
コンパイラがソースコードを解析し、バイトコード(.class)という中間コードを生成します - 実行(JVM)
Java仮想マシン(JVM)がバイトコードを読み込み、OSごとの機械語に変換しながら実行します
したがって、javac コマンドの主な役割は、ソースコードの文法チェックを行い、正しいバイトコードを生成することにあります。
javacが行う3つの内部処理
さらに詳しく見ると、javac の内部では以下の処理が行われています。
- 構文解析(Syntax Check):
;の忘れやスペルミスがないかチェックします - 意味解析(Semantic Analysis):変数の型が正しいか、メソッドが存在するかなどを検証します
- バイトコード生成:問題がなければ
.classファイルを出力します
参考リンク:Oracle公式 Java Language and Virtual Machine Specifications
JVM・JRE・JDKの違い(初心者が迷うポイント)
コンパイルを理解する上で避けて通れないのが、JDK、JRE、JVMという3つの用語です。これらは包含関係(入れ子構造)になっています。
| 用語 | 正式名称 | 役割 |
|---|---|---|
| JDK | Java Development Kit | 開発キット。コンパイラ(javac)を含む開発ツールのセット。 |
| JRE | Java Runtime Environment | 実行環境。JVMと標準ライブラリのセット。 |
| JVM | Java Virtual Machine | 仮想マシン。バイトコードを解釈して実行するエンジン。 |
つまり、「開発者はJDKが必要、ユーザーはJRE(またはJVM)があれば良い」と覚えておけば間違いありません。
javacコマンドの基本手順と構文
ここからは、実際にコマンドラインでコンパイルを行う手順を解説します。基本構文は非常にシンプルです。
1. 単一ファイルのコンパイル
最も基本的な使い方は、ファイル名を指定して実行するだけです。
javac Main.java
エラーがなければ何も表示されず、同じディレクトリに Main.class が生成されます。これが成功の証です。
2. 実行方法
生成された .class ファイルを実行するには、java コマンドを使います。ここで注意すべきなのは、拡張子(.class)を付けないことです。
# 正しい実行方法
java Main
# 間違い(拡張子は不要)
java Main.class
3. 複数ファイルの一括コンパイル
実務では数十〜数百のファイルを扱います。ワイルドカード(*)を使えば、ディレクトリ内の全ファイルをまとめてコンパイルできます。
javac src/*.java
最重要:クラスパス(classpath)の正しい設定
Javaコンパイルで初心者が最も悩み、実務でもトラブルの原因となるのが「クラスパス(classpath)」です。
クラスパスとは、簡単に言えば「Javaに対して、必要な部品(クラスやライブラリ)がどこにあるかを教えるための経路」です。これが正しく設定されていないと、コンパイラは他のクラスを見つけることができません。
-cp オプションの使い方
外部ライブラリ(jarファイルなど)や、別のディレクトリにある自作クラスを使いたい場合は、-cp(または -classpath)オプションで場所を指定します。
# Windowsの場合(区切り文字はセミコロン ; )
javac -cp ".;C:libmylib.jar" Main.java
# macOS / Linuxの場合(区切り文字はコロン : )
javac -cp ".:/usr/local/lib/mylib.jar" Main.java
ここで特に注意すべきポイントは以下の2点です。
- カレントディレクトリ(.)を含める:現在のフォルダにあるクラスも参照したい場合、明示的に
.を含める必要があります - OSによる区切り文字の違い:Windowsは
;、Mac/Linuxは:です。これを取り違えると、エラーメッセージが出ても原因に気づきにくいため注意が必要です
参考リンク:Oracle公式 クラスパスの設定方法
実務で頻発するエラーと対策
最後に、開発現場でよく遭遇するコンパイルエラーと、その解決策を紹介します。
1. error: cannot find symbol(シンボルが見つかりません)
最も頻繁に見るエラーです。「クラス」「メソッド」「変数」が見つからない場合に発生します。
- 原因A:スペルミス(大文字・小文字の違い含む)
- 原因B:
import文の記述忘れ - 原因C:クラスパスの設定漏れ(外部ライブラリへのパスが通っていない)
対策: まずスペルを確認し、次に -cp オプションで指定したパスに本当にファイルが存在するか確認してください。
2. error: unmappable character for encoding(文字化け・エンコーディングエラー)
ソースコードに日本語(マルチバイト文字)が含まれている場合、OSのデフォルト文字コードとファイルの文字コードが一致しないと発生します。
特にWindows(デフォルトがShift-JIS系の場合が多い)で、UTF-8で書かれたソースをコンパイルするときによく起きます。
対策: -encoding オプションで明示的に文字コードを指定します。
javac -encoding UTF-8 Main.java
3. Unsupported major.minor version(バージョンの不一致)
「新しいJavaでコンパイルされたクラス」を「古いJavaで実行」しようとすると発生します。
対策: java -version と javac -version を実行し、バージョンが一致しているか、あるいは実行環境がコンパイル環境以上のバージョンであることを確認してください。
まとめ
本記事では、Javaコンパイルの仕組みから実務的なコマンド操作まで解説しました。
- コンパイルの本質:人間語(.java)を機械語に近い中間コード(.class)へ変換する
- 必須ツール:開発にはJDKが必要
- クラスパス:外部ファイルを利用する際の「地図」。OSによる区切り文字の違いに注意
- トラブル対応:文字コード指定やパス確認で解決できることが多い
IDEを使っていると意識しづらい部分ですが、これらの基礎知識は、エラー時の調査能力や環境構築のスキルに直結します。まずは簡単なプログラムをコマンドラインだけでコンパイル・実行し、手ごたえを掴んでみてください。
さらに、実務レベルでのJava開発スキルや、Spring Bootなどのフレームワーク活用法を学びたい場合は、現役エンジニアのサポートを受けながら学習を進めるのが最も効率的です。
つまずいたら、現役エンジニアと一緒に解決しよう
この記事で扱った【Java】は、独学だと細部で詰まりやすい分野です。さらに理解を深めたい方は、Zerocode Onlineで実務直結の学習を進めてみませんか。
コード添削・詰まり解消を丁寧にサポート。
Java/SQL/Spring Bootを体系的に習得。
現場で刺さる成果物づくりを伴走。
時間と場所を選ばず学べます。