プログラミングの学習を始めたばかりの方から、WindowsからMac環境へ移行してきてJavaファイルのコンパイル方法が分からないといった方向けに、Mac環境でのJavaのコンパイル方法をご紹介していきたいと思います。
目次
Javaファイルのコンパイルって何?
コンパイルとは
コンパイルとは「プログラムのソースコードをコンピューターが実行可能な機械語に翻訳すること」を指します。
プログラマーが作成したソースコードは人間が分かるように記述したもので、そのままの状態ではコンピューターは理解する事が出来ないため「コンパイル」という作業を通して、コンピューターが理解出来る機械語へ変換をかける作業のことを示します。
ではその翻訳作業は誰がするのかというのが次にご紹介する「コンパイラ」です。
コンパイラとは
初心者の方で名前が似ていることから混乱しがちなのが「コンパイル」と「コンパイラ」の違いです。
「プログラム」と「プログラマー」の違いと似たイメージで、「コンパイル」は機械語へ変換する作業自体を示し、「コンパイラ」は機械語へ変換するための作業をするシステムのことを指します。
Javaでは「javac」というコンパイラが利用され、「Java SE Development Kit(JDK)」に含まれています。
Javaファイルをコンパイルして実行してみよう
ここからは実際にJavaファイルを作成し、コンパイルして実行するまでの手順をご紹介していきたいと思います。
サンプルで実行するJavaファイルを作成しよう
まずはサンプルで実行する用のJavaファイルを作成する必要があります。
自身でコンパイルしたいJavaファイルが特にない場合は、メモ帳でも何でも構わないので下記のコードをサンプルとして「Main.java」のファイル名で保存してください。
public class Main { public static void main(String args[]) { System.out.println("Hello World"); } }
保存した「Main.java」のファイルは、Finderの「書類」→「sample」フォルダに格納してください。
ターミナルでJavaファイルを格納した場所に移動する
次にターミナルを開いて「Main.java」を格納したフォルダに移動しましょう。
「書類」→「sample」フォルダに移動している場合は下記のコマンドで移動出来ます。
cd Documents/sample/
下記の画像では「ls」コマンドで「sample」フォルダにMain.javaファイルが格納されているのを確認出来ます。
Javaファイルをコンパイルしよう
ファイルを格納しているディレクトリに移動出来たので、実際に「コンパイル」を実施します。
下記のコマンドが「Main.java」ファイルのコンパイルコマンドとなります。
javac Main.java
実行した結果が下記の画像の通りとなります。
1枚目の画像では特に何も表示されず次の行に移動していますが、コンパイルに成功した場合の例です。
コンパイルに失敗した場合は下記の画像のようにエラー文が出力されるので、表示されている内容に従って修正するようにしてください。
下記の画像では、「System.out.println(“Hello World”)」の行で文末に「;」を設定していないため出ているコンパイルエラーです。
2枚目の画像に関しては、「ls」コマンドでカレントディレクトリのファイルを確認し「Main.class」というファイルが追加されているのをご確認頂けます。
「Main.class」ファイルがコンパイル済みのJavaの実行ファイルとなります。
コンパイル済みのファイルを実行してみよう
コンパイル済みの「Main.class」ファイルを実際に実行するには下記のコマンドとなります。
java Main
コマンドを実行した結果が下記の通りとなります。
ポイントとしては実行する「classファイル」の「.class」は指定しないようにしてください。
実行結果はサンプルコードでは「Hello World」が出力される結果となります。
複数ファイルで構成されたソースコードをコンパイルしてみよう
上述したサンプルコードは1つのファイルで完結していましたが、通常システムを作成する場合には複数ファイルに跨ることがほとんどです。
次は複数ファイルに跨るサンプルコードをコンパイルして実行してみましょう。
サンプルで実行する2つのJavaファイル
まず1つ目のファイルを「Main.java」として下記のサンプルコードを作成しています。
public class Main { public static void main(String args[]) { Sub sub = new Sub(); System.out.println(sub.content); } }
2つ目のファイルは「Sub.java」として下記のサンプルコードを作成します。
public class Sub { String content = "Subクラスのフィールド値です。"; }
プログラムとしては「Sub.java」ファイルにフィールド値の初期値を設定しておき、「Main.java」でSubクラスのフィールド値を参照し表示するだけの簡単なものです。
2つのファイルをコンパイルしよう
では実際に作成したJavaファイルをコンパイルしてみましょう。
今回もJavaファイルを格納しているディレクトリは「書類」→「sample」としています。
Javaファイルのコンパイルは先程と同様下記のコマンドで行います。
javac Main.java
実行した結果を確認すると「Main.class」以外に「Sub.class」が作成されているのが確認出来ます。
Javaのコンパイラである「javac」ではコンパイルに指定したファイルの参照先を自動的に探して、一緒にコンパイルしてくれる便利な機能が提供されています。
コンパイルしたクラスファイルを実行してみよう
では作成したクラスファイルを実際に実行してみましょう。
コマンドは1つのクラスファイルを実行した上記のサンプルと全く同じです。
java Main
コマンドを実行した結果が下記の通りとなります。
「Main.java」を実行して、「Sub.java」に定義したフィールド値の値が出力されている事がご確認頂けます。
別階層に格納したJavaファイルをコンパイルして実行しよう
Javaファイルを複数コンパイルする方法をご紹介しましたが、上記のサンプルは同一ディレクトリにファイルが配置されている場合のサンプルとなります。
例えば「Main.java」ファイルを「書類」→「sample」に格納し、「Sub.java」ファイルを「書類」→「sample」→「subDir」に格納したとします。
同じように「Main.java」をコンパイルすると「Sub.java」を参照する事が出来ず下記のようなエラーとなってしまいます。
コンパイル時に参照先のパスを指定してあげよう
では同一ディレクトリ以外に参照先のファイルが格納されている場合どうするのかと言うと、コンパイル時にコマンドで参照先のフォルダを指定してあげることで解決する事が出来ます。
javac -cp .:subDir/ Main.java
上記のコマンドでは「-cp(classpath)」オプションを付け「.」カレントディレクトリと「subDir」を参照するように設定しています。
複数ディレクトリを指定する際には「:」で区切ります。
コマンドを実行した結果「Main.class」と「Sub.class」が生成されている事が確認頂けます。
javacではコンパイル時に出力先を指定していない場合、元のJavaファイルが格納されている階層と同階層にクラスファイルが作成されるため、上記のように「Sub.class」はサブディレクトリに格納される結果となっています。
参照先のクラスファイルが別階層に格納されている場合実行時にも注意が必要
サンプルのように生成されたクラスファイルが別ディレクトリに格納されている場合、参照先を教えてあげずに実行すると下記のようなエラーとなってしまいます。
コンパイル時に指定したように実行時にも参照先のクラスの場所を教えてあげないといけません。
下記のコマンドが「subDir」に格納されている「Sub.class」ファイルを参照して実行する際のコマンドとなります。
java -cp .:subDir/ Main
javacコマンドでコンパイルした時と同様、「-cp(classpath)」オプションで「.(カレントディレクトリ)」と「subDir」を参照するように指定しています。
実行した結果は下記の通りです。
環境変数に設定してしまう方法をご紹介
別階層のファイルをコンパイルする方法をご紹介しましたが、コンパイル毎にオプションコマンドを面倒なため環境変数に参照先を設定してしまう方法もあります。
CLASSPATH=.:subDir/; export CLASSPATH
クラスパスに指定した状態でコンパイルから実行をした結果は下記の通りとなります。
クラスパスを環境変数に設定したことにより、「javac」コマンドでのコンパイル時と「java」コマンドでの実行時に「-cp(classpath)」オプションを付けなくても処理が完了している事がご確認頂けます。
さいごに:Javaのコンパイル方法はしっかりと理解しておこう!
本記事ではMac環境でのJavaファイルをコンパイルして実行する方法をご紹介してきました。
最近ではeclipseなどのIDEを用いた開発が主流となっていることから、IDEで簡単にコンパイル作業が可能なため、ターミナルでのコマンド操作でコンパイルを行う方法は知らない方も意外と多いものです。
コマンドでのコンパイル方法を知ることで、IDEがどのようにコンパイルを行なっているかについて深い理解にも繋がりますので、ぜひ一度ご自身でもコマンドでのJavaファイルのコンパイル作業を試してみてください。
まずコンパイルの方法を説明する前に「コンパイル」とは何かをご紹介していきます。