【Java】javac・javaコマンドで理解するコンパイルと実行の仕組み

Java

こんにちは、かつコーチです。

前回はIntelliJ IDEAでボタン一つでJavaを実行できるようになりました。

ただ、IDEの「実行ボタン」の裏側で何が起きているかを知らないと、エラーが出たときに対処できません。

今回は、IntelliJを使わずコマンドラインでjavacjavaコマンドを直接使い、コンパイルと実行の仕組みを理解します。

私はこの仕組みを理解しないままIDEに頼っていたため、クラス名とファイル名がずれるエラーの意味が最初まったく分かりませんでした。

コンパイルと実行の仕組みとは

javacとjavaの役割の違い

Javaのプログラムは、書いたコードがそのまま実行されるわけではありません。

  • javac.javaファイル(ソースコード)を.classファイル(バイトコード)に変換するコンパイラ
  • java.classファイルをJVM上で実行するコマンド

つまり「書く→変換する→実行する」という2段階の工程を、javacjavaという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文字でも違う場合に発生します。

publicstaticの書き忘れ、引数の型をString[]ではなくStringと書いてしまうミスがよくある原因です。

応用・一歩先の使い方

複数のクラスファイルを扱う場合、javacにワイルドカードを使ってまとめてコンパイルできます。

javac *.java
java HelloWorld

さらにファイル数が増えてくると、ファイルを1つずつ管理するのは非効率になります。

そこで登場するのが、次回以降で解説するMavenGradleといったビルドツールです。

まとめ

この記事のポイント

  • javacはソースコードをバイトコードに変換するコンパイラ
  • javaコマンドはバイトコードをJVM上で実行する
  • public classの名前とファイル名は必ず一致させる必要がある
  • mainメソッドのシグネチャが1文字でも違うと実行時エラーになる

次に読むべき記事

コマンドラインでの実行が理解できたら、次はファイルが増えても管理しやすくなるビルドツール、Mavenの基本を見ていきます。

→ 次の記事:Mavenでプロジェクトを管理する基本

タグ: Java, 初心者向け, 環境構築

タイトルとURLをコピーしました