コンパイルと実行
Javaのコードを書いてから、プログラムが動くまでには何が行われているのでしょうか。短いプログラムを自分でコンパイルして実行し、ソースファイルとクラスファイルの違いを確かめてみましょう。
本編ではIntelliJ IDEAの実行ボタンを使っていますが、ここではコマンドを入力して同じことをやってみます。普段はIDEに任せている作業を、一つずつ確かめるための補足記事です。
ソースファイル(プログラム)を作る
さっそく簡単なプログラムを書いて動かしてみます。まずは、作業用にjava-practiceというフォルダを好きな場所に作ってください。
次にテキストエディタで、以下のプログラムを書きます。Javaのソースコードは普通のテキストなので、メモ帳のようなエディタでも書けます。Macのテキストエディットを使う場合は、標準テキスト形式にしてください。
Test.java
public class Test {
public static void main(String[] args) {
System.out.println("hello");
}
}このプログラムは、helloという文字を表示します。コードの意味がまだ分からなくても、今は大丈夫です。まずは動かしてみましょう。
Javaでは大文字と小文字を区別します。Test、String、Systemの頭文字は大文字です。行末のセミコロンや、カッコの種類、文字列を囲む半角のダブルクォーテーションにも気を付けてください。
自分で入力してみると、打ち間違いを見つけて直すことも練習になります。字下げは読みやすくするためのものなので、見本のように行頭を揃えておきましょう。
書けたら、作業用フォルダにTest.javaという名前で保存します。文字コードはUTF-8にしてください。public class Testと書いたので、ファイル名も大文字・小文字を含めてTest.javaに揃えます。
これでJavaのソースファイルができました。ソースファイルとは、人が書いたプログラムを保存したファイルです。Javaでは拡張子に.javaを使います。
ソースファイルをコンパイルする
作ったソースファイルを、そのままCPUが読んで動かすわけではありません。まずコンパイルという作業で、別の形式に変換します。
Javaの場合は、ソースコードをJava仮想マシン(JVM)が実行できるバイトコードなどを含むクラスファイルに変換します。その際に、文法や型の使い方などもチェックされます。
難しい言葉が出てきましたが、まずは「人が書いたTest.javaから、実行に使うTest.classを作る作業」だと思ってください。
ターミナルを開く
WindowsならPowerShellやコマンドプロンプト、Macならターミナルを開きます。ここでは、文字でコマンドを入力する画面をまとめて「ターミナル」と呼びます。
まず次のコマンドを、一行ずつ入力してEnterを押してください。コマンドと引数の間には、半角スペースを入れます。
javac -version
java -version両方ともバージョン情報が出れば、それぞれのコマンドを使える状態です。この練習では、同じJDKのjavacとjavaを使ってください。
バージョンが表示されない場合
「コマンドが見つかりません」「認識されていません」「Javaが見つかりません」などと出た場合は、ターミナルがJDKを見つけられていない可能性があります。javaだけ動いてjavacが動かない場合も、次の手順で確認してください。両方とも使えている方は、次の「ソースファイルのあるフォルダへ移動する」に進んで大丈夫です。
IntelliJ IDEAでJavaを実行できても、別に開いたPowerShellやMacのターミナルで、同じJDKが使えるとは限りません。そこで、JDKの場所を確認し、その中のbinフォルダをコマンドの検索先(PATH)に追加する作業をします。
今回は、この練習に使うターミナルを開いている間だけ有効な設定にします。OSの設定画面や設定ファイルを編集する必要はありません。
① IntelliJ IDEAでJDKの保存場所を確認する
- 第1講で作ったJavaのプロジェクトをIntelliJ IDEAで開きます。
- メニューのFile(ファイル)→ Project Structure(プロジェクト構造)を開きます。
- Project Settings → Projectで、使用中のSDKの名前を確認します。
- Platform Settings → SDKsで、その名前のJDKを選びます。表示されるJDK home path(JDKのホームパス)をコピーしてください。
このパスが、使用するJDKの保存場所です。表示名は言語設定やバージョンで多少異なる場合があります。SDKが未設定なら、同じ画面のDownload JDKでダウンロードし、プロジェクトのSDKとして選んでから保存場所を確認します。
確認したフォルダの中にbinフォルダがあり、その中にWindowsならjavac.exeとjava.exe、Macならjavacとjavaがあることを確認してください。MacではJDKのホームパスがContents/Homeで終わることがあります。その場合も、その後ろに/binを付けます。
② Windowsの場合:PowerShellでPATHに追加する
PowerShellを開いて、次の一行を入力します。引用符の中は、①でコピーしたパスの末尾に\binを付けたものに置き換えてください。以下は保存場所の例なので、そのままコピーするだけでは動きません。
$env:Path = "C:\Users\Nobuo\.jdks\jdk-25\bin;" + $env:Path例えばホームパスがC:\Java\jdk-25なら、引用符の中はC:\Java\jdk-25\bin;になります。最後のセミコロンも必要です。右側の+ $env:Pathは、これまでの検索先を残すための部分なので、そのまま入力してください。
この行はPowerShell用です。コマンドプロンプトでは使えません。入力しても通常は何も表示されませんが、それで大丈夫です。
② Macの場合:ターミナルでPATHに追加する
Macの標準的なzshやbashでは、次の一行を入力します。引用符の中のJDKのホームパスを①で確認した場所に置き換え、その後ろに/bin:$PATHを付けてください。
export PATH="/Users/Nobuo/Library/Java/JavaVirtualMachines/jdk-25/Contents/Home/bin:$PATH"このパスも一例です。自分のユーザー名やJDKのフォルダ名に合わせて置き換えます。末尾の:$PATHは、これまでの検索先を残すための部分なので消さないでください。こちらも通常は何も表示されません。
③ 同じ画面でもう一度確認する
Windows・Macともに、今設定したターミナルを閉じずに、次の二つをもう一度実行します。
javac -version\njava -version両方とも、選んだJDKのバージョンが表示されれば準備完了です。このまま同じ画面で、次のフォルダ移動とコンパイルに進んでください。
まだ表示されない場合は、コピーしたパスが正しいか、binを付け忘れていないか、引用符が半角の"になっているかを確認しましょう。別のJavaのバージョンが表示される場合は、次のコマンドで呼び出し先を確認できます。
Get-Command javac, java | Select-Object Name, Sourcecommand -v javac\ncommand -v java①で確認したJDKのbin内を指しているか見てください。今回の設定は、この画面を閉じると引き継がれません。後日また試す時は、新しく開いたターミナルで②を行えば使えます。
ソースファイルのあるフォルダへ移動する
ターミナルには、現在の作業場所となるフォルダがあります。これをカレントディレクトリと言います。ディレクトリは、ここではフォルダと同じ意味だと思って大丈夫です。
作業場所を変えるにはcdというコマンドを使います。例えばWindowsのPowerShellで、次の場所にjava-practiceフォルダを作ったなら、こう入力します。
cd "C:\Users\Nobuo\java-practice"Macなら、例えば次のような形です。
cd "/Users/Nobuo/java-practice"Nobuoの部分も含め、パスは自分が実際に作ったフォルダの場所に置き換えてください。引用符で囲んでおけば、途中にスペースがあるパスも指定できます。Windowsのコマンドプロンプトでドライブも変える場合は、cd /d "移動先のパス"とします。
移動できたら、Windowsではdir、Macではlsを入力すると、フォルダ内のファイルを確認できます。Test.javaが見つかれば準備OKです。
javacでコンパイルする
Javaのソースファイルをコンパイルするには、javacを使います。Test.javaのあるフォルダで、次のコマンドを実行してください。
javac -encoding UTF-8 Test.java-encoding UTF-8は、ソースファイルをUTF-8として読み込む指定です。エディタで保存した文字コードと揃えています。
この例では、成功すると通常は何も表示されず、次のコマンドを入力できる状態に戻ります。作業用フォルダを見てみましょう。Test.classというファイルができているはずです。これがクラスファイルです。
エラーが出た場合は、まず表示された内容と行番号を見て、Test.javaをエディタで開いて確認します。修正して保存したら、同じコンパイルのコマンドをもう一度実行してください。
「ファイルが見つかりません」と出た場合は、コードの中身より先に、作業場所とファイル名を確認しましょう。Test.java.txtになっていないかもチェックです。
クラスを実行する
コンパイルできたら、今度はjavaコマンドで実行します。javacの最後のcがなくなりましたね。Test.classのあるフォルダで入力します。
java Testhellohelloと出ましたね! 今回作ったTestクラスは、helloという文字をコンソールに表示するプログラムでした。
コンパイルの時はTest.javaとファイル名を指定しました。一方、ここでjavaコマンドに渡しているTestは、実行を始めるクラス名です。だから.classは付けません。
javaコマンドがJVMを起動し、Testクラスのmainメソッドからプログラムが動き始めます。
| 作業 | コマンド | 結果 |
|---|---|---|
| コンパイル | javac -encoding UTF-8 Test.java | Test.classができる |
| 実行 | java Test | helloが表示される |
書き換えたら、もう一度コンパイルする
では、Test.javaのhelloを、好きな文字に変えてみましょう。ここではHello, Java!に変えてみます。
Test.java
public class Test {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}保存できたら、もう一度コンパイル → 実行です。次の二行を順番に実行します。コンパイルでエラーが出た場合は、先に直してください。
javac -encoding UTF-8 Test.java
java TestHello, Java!表示が変わりました。コンパイルし直すと、新しい内容でTest.classが上書きされます。
ここで大事なのは、Test.javaを保存しただけでは、Test.classは更新されないことです。再コンパイルせずにjava Testを実行すると、以前のクラスファイルが使われるので、表示はhelloのままです。
本編で使うIDEは、こうしたコンパイルや実行を手助けしてくれます。ボタン一つで動かしている時も、「ソースコードを変換し、その結果を実行する」という流れがあるわけですね。
質問・コメント
読み込み中この記事についての質問や、学習して気づいたことをお寄せください。
この記事のコメント
旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。
コメントを読み込んでいます。