こんにちは、かつコーチです。
前回はIntelliJ IDEAでボタン一つでJavaを実行できるようになりました。
ただ、IDEの「実行ボタン」の裏側で何が起きているかを知らないと、エラーが出たときに対処できません。
今回は、IntelliJを使わずコマンドラインでjavac・javaコマンドを直接使い、コンパイルと実行の仕組みを理解します。
私はこの仕組みを理解しないままIDEに頼っていたため、クラス名とファイル名がずれるエラーの意味が最初まったく分かりませんでした。
コンパイルと実行の仕組みとは
javacとjavaの役割の違い
Javaのプログラムは、書いたコードがそのまま実行されるわけではありません。
- javac:
.javaファイル(ソースコード)を.classファイル(バイトコード)に変換するコンパイラ - java:
.classファイルをJVM上で実行するコマンド
つまり「書く→変換する→実行する」という2段階の工程を、javacとjavaという2つのコマンドがそれぞれ担当しています。
なぜこの仕組みを知る必要があるのか
IDEはこの2つのコマンドを裏側で自動的に呼び出しているだけです。
仕組みを理解していれば、「コンパイルエラー」と「実行時エラー」のどちらが起きているのかを、エラーメッセージから正確に判断できるようになります。
これはJ01で解説した「一度書けばどこでも動く」という特徴を、コマンドレベルで体感することにもつながります。
基本の書き方:コマンドラインでの実行手順
手順1:ソースコードを用意する
任意のフォルダにHelloWorld.javaというファイルを作成します。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("コマンドラインから実行");
}
}
手順2:コンパイルする
ターミナルでファイルのあるフォルダに移動し、javacでコンパイルします。
javac HelloWorld.java
成功すると、同じフォルダにHelloWorld.classというバイトコードのファイルが生成されます。
手順3:実行する
生成された.classファイルをjavaコマンドで実行します。
java HelloWorld
コマンドラインから実行
ここで注意したいのは、実行時に指定するのはHelloWorld.classではなく、拡張子を除いたHelloWorldというクラス名である点です。
つまずきやすい設定・注意点
Java 11以降では、単一ファイルのプログラムに限り、コンパイルを省略して直接実行できるjava HelloWorld.javaという書き方も使えます。
学習中の動作確認では便利ですが、複数ファイルで構成される実際のプロジェクトでは、通常どおりjavacでのコンパイルが必要になります。
よくあるつまずきポイント・エラー対処
クラス名とファイル名が一致していない
❌ Before:ファイル名とpublicクラス名を一致させずに保存する
私は最初、Main.javaというファイルの中に、うっかりpublic class HelloWorldと書いてしまったことがあります。
コンパイルしようとすると、次のエラーが表示されました。
error: class HelloWorld is public, should be declared in a file named HelloWorld.java
「ファイル名と関係あるの?」と最初はピンとこず、しばらくコードの中身ばかり見直していました。
✅ After:public classの名前とファイル名を一致させる
Javaでは、publicが付いたクラスの名前と、そのファイル名を必ず一致させるというルールがあります。
public class HelloWorldと書くなら、ファイル名はHelloWorld.javaにする必要があります。
// ファイル名:HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("正しく実行できました");
}
}
このルールを知ってからは、ファイルを作る瞬間にクラス名を先に決める習慣がつきました。
mainメソッドが見つからない
javaコマンド実行時に、次のようなエラーが出ることもあります。
Error: Main method not found in class HelloWorld
これはmainメソッドのシグネチャ(public static void main(String[] args))が1文字でも違う場合に発生します。
publicやstaticの書き忘れ、引数の型をString[]ではなくStringと書いてしまうミスがよくある原因です。
応用・一歩先の使い方
複数のクラスファイルを扱う場合、javacにワイルドカードを使ってまとめてコンパイルできます。
javac *.java
java HelloWorld
さらにファイル数が増えてくると、ファイルを1つずつ管理するのは非効率になります。
そこで登場するのが、次回以降で解説するMavenやGradleといったビルドツールです。
まとめ
この記事のポイント
javacはソースコードをバイトコードに変換するコンパイラjavaコマンドはバイトコードをJVM上で実行するpublic classの名前とファイル名は必ず一致させる必要があるmainメソッドのシグネチャが1文字でも違うと実行時エラーになる
次に読むべき記事
コマンドラインでの実行が理解できたら、次はファイルが増えても管理しやすくなるビルドツール、Mavenの基本を見ていきます。
→ 次の記事:Mavenでプロジェクトを管理する基本
タグ: Java, 初心者向け, 環境構築