Javaのプログラム実行方法を完全解説!初心者でもわかるjavacとjavaコマンドの使い方
生徒
「Javaプログラムをコマンドで実行する方法がいまいち分かりません。javacとjavaって何が違うんですか?」
先生
「いい質問ですね!javacはJavaソースコードをコンパイルするコマンド、javaはコンパイル済みのクラスを実行するコマンドです。それぞれの役割と使い方を詳しく見ていきましょう。」
生徒
「なるほど!プログラムの実行フローが分かりそうです!」
1. Javaプログラムの基本的な実行手順
Javaプログラムを実行する際の基本的な手順は以下の通りです。
- ソースコードを作成し、
.javaファイルに保存する。 javacコマンドを使ってソースコードをコンパイルし、.classファイルを生成する。javaコマンドを使って、生成された.classファイルを実行する。
以下は具体例です。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
上記のプログラムをHelloWorld.javaとして保存し、次のコマンドを実行します。
> javac HelloWorld.java
> java HelloWorld
出力:
Hello, Java!
この手順がJavaプログラムの基本的な実行方法です。
2. Java SE 11以降での直接実行
Java SE 11以降では、javacコマンドを使わずにjavaコマンドだけでソースコードを実行することが可能です。この機能は「ソースファイルモード」と呼ばれます。
次のように実行します。
> java HelloWorld.java
出力:
Hello, Java!
この方法では、javacで明示的にコンパイルしなくても、javaコマンドがバックグラウンドでコンパイルを行い、プログラムを実行します。
3. コマンドの注意点と他のコマンド
Javaプログラムを実行する際の注意点と、他の関連コマンドを紹介します。
javap: クラスファイルの内部構造を確認できます。jmod: モジュールを管理するためのコマンドです。- ソースファイルモードでは、ファイル名とクラス名が一致していなくても実行可能です。
以下は、クラス名とソースファイル名が一致していない場合の例です。
public class Sample {
public static void main(String[] args) {
System.out.println("クラス名とファイル名が一致していません!");
}
}
これをTest.javaとして保存し、次のように実行します。
> java Test.java
出力:
クラス名とファイル名が一致していません!
4. javacとjavaの違いを理解する
javacはソースコードをコンパイルしてバイトコードを生成するコマンドであり、javaはそのバイトコードを実行するコマンドです。この違いを理解することで、エラーの原因を特定しやすくなります。
ソースコードの構造や実行環境に応じて適切なコマンドを選び、効率的な開発を行いましょう。
5. コンパイルで生成されるクラスファイルの中身
javacコマンドを実行すると、コンピュータが直接理解できる形式ではなく、Java仮想マシン(JVM)が理解できる「バイトコード」という形式のファイル(.class)が生成されます。
プログラミング未経験の方でも、以下のコマンドを使ってその「正体」を少しだけ覗き見ることができます。
javap -c HelloWorld
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String Hello, Java!
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
このように、私たちが書いたJavaのコードは、一度JVM専用の命令セットに翻訳されます。この仕組みがあるおかげで、一度コンパイルすればWindowsでもMacでも同じように動作させることができるのです。
6. 実行時エラーが発生した時の対処法
コマンドで実行していると、赤い文字で英語のエラーメッセージが表示されることがあります。初心者が最も遭遇しやすいのが、「クラスが見つからない」というエラーです。
例えば、javaコマンドで実行する際に、誤って拡張子(.class)をつけてしまった場合の挙動を確認しましょう。
java HelloWorld.class
エラー: メイン・クラスHelloWorld.classが見つからなかったかロードできませんでした
原因: java.lang.ClassNotFoundException: HelloWorld.class
javaコマンドに渡すのは「ファイル名」ではなく「クラス名」である必要があります。エラーが出たときは、以下のチェックリストを確認してみてください。
- ファイル名の綴り: 大文字と小文字は正しく区別されているか。
- 実行場所:
.classファイルが存在するディレクトリ(フォルダ)でコマンドを打っているか。 - 拡張子の有無:
javaコマンドの後ろに.classをつけていないか。
エラーメッセージを読み解く力は、プログラミング学習において最も重要なスキルの一つです。
7. パッケージに含まれるクラスの実行方法
本格的な開発では、クラスを「パッケージ」というフォルダのような仕組みで管理します。この場合、実行方法が少し特殊になります。
例えば、com.exampleパッケージに属するプログラムの場合、ソースコードの先頭に以下のように記述します。
package com.example;
public class MyProgram {
public static void main(String[] args) {
System.out.println("パッケージ版の実行成功!");
}
}
このプログラムを実行するには、パッケージの階層構造を守ったままコンパイルし、「完全限定名(フルクオリティネーム)」で呼び出す必要があります。
javac -d . MyProgram.java
java com.example.MyProgram
パッケージ版の実行成功!
-d . というオプションは「現在のフォルダにパッケージのディレクトリを自動で作ってね」という命令です。最初は難しく感じるかもしれませんが、この「フォルダ構造とクラス名の関係」を理解することが、Javaマスターへの第一歩となります。
まとめ
Javaのjavacコマンドとjavaコマンドの違いや使い方について理解を深めました。javacはソースコードをコンパイルして.classファイルを生成し、javaはそのクラスファイルを実行します。
また、Java SE 11以降でのソースファイルモードにより、javacコマンドを使用せずに直接ソースコードを実行できる便利な機能も学びました。
以下は、これまで学んだ内容を簡単におさらいするプログラム例です。
public class CommandLineExample {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("引数がありません。プログラムを実行しました!");
} else {
System.out.println("受け取った引数:");
for (String arg : args) {
System.out.println(arg);
}
}
}
}
上記のプログラムをCommandLineExample.javaとして保存し、次のように実行します。
> java CommandLineExample apple orange banana
出力:
受け取った引数:
apple
orange
banana
このように、Javaの実行環境とコマンドを正しく理解し、プログラムを効果的に実行するスキルを身につけましょう。
生徒
「javacとjavaの違いがよく分かりました!特にソースファイルモードは便利ですね。」
先生
「その通りです。簡単なコードを試したいときや学習時にはとても役立ちますね。ただし、正式なプロジェクトではjavacを使ったコンパイルが一般的です。」
生徒
「実行時に.javaファイルを直接使えることを知って、作業が効率的になりそうです!」
先生
「その意識を持ちながら、引数の扱いやエラー処理にも気を配ると良いプログラマーになれますよ。」