近年の開発ではEclipseを初めとした統合開発環境(IDE)を利用することが基本になっており、ターミナル(コマンドライン)でのJava実行方法を知らない開発者も多くいます。
本記事では基本に立ち返って、コマンドを利用したJava実行方法について確認していきましょう。
Javaファイルを実行する仕組みについて理解しよう
Javaでプログラミングを行う場合、Javaファイルと呼ばれるコードが記述されたファイルを作成しただけでは実際にシステムとして動かすことは出来ません。
基本的なJavaプログラムを動かす仕組みについて確認しておきましょう。
Javaファイルはコンパイルしてクラスファイルを作成する必要がある
Javaファイルに記述されたプログラミング言語のコードではコンピューターが解釈することが出来ないため、クラスファイルと呼ばれるコンピューターが解釈出来る中間言語に「コンパイル」する必要があります。
「コンパイル」をコマンドから行う方法は下記の通りとなります。
javac Javaファイルに付けた名前
具体的には「Main.java」ファイルをコンパイルしようと思うと下記のコマンドを入力する必要があります。
javac Main.java
実行した結果「Main.class」というコンピューターが理解出来るクラスファイルが作成されます。
Javaのクラスファイルを指定して実行する
Javaプログラムをコンパイルしてクラスファイルまで作成するとあとは実際に実行するだけです。
下記のコマンドでJavaプログラムを実行することが可能です。
java クラスファイルの名称
注意して頂きたいのが、クラスファイルの名称を指定する際には拡張子「.class」を除いた名称で指定するようにしましょう。
実際に「Main.class」を実行する場合は下記のコマンドを実行します。
java Main
サンプルコードで確認しよう
では実際にサンプルコードをコンパイルして実行してみましょう。
まず「Main.java」ファイルを用意します。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { System.out.println("ポテパン"); } }
次にコンパイルするため、下記のコマンドを実行します。
javac Main.java
下記の画像のように、「Main.class」ファイルが追加されていることが確認出来ます。
最後に下記のコマンドで実行した結果が画像の通りとなり、指定した「ポテパン」の文字が出力されていることを確認出来ます。
java Main
複数ファイルのJavaプログラムを実行するには
プログラムは通常1つのファイルだけで完結することは少なく、複数ファイルに記述されたコードをまとめて実行する必要があります。
同一階層のクラスファイルなら単一ファイルと同様の方法でコンパイル可能
同じフォルダ内に「Main.java」と「Sub.java」というソースファイルがある場合、コンパイルはMain.javaを指定してコンパイルするだけで「Main.class」と「Sub.class」が作成されます。
javac Main.java
Javaのコンパイラーである「javac」がコンパイル対象として指定した「Main.java」から「Sub.java」を参照していることを判別し、自動でコンパイルが行われているため、「Main.java」のソースと全く関係ないファイルの場合には、コンパイルされることはありません。
階層が異なるディレクトリにファイルが保存されている場合
階層が異なるディレクトリに参照したいファイルが保存されている場合、コンパイル時に明示的に指定してあげる必要があります。
javac -cp .:ディレクトリ名/ ファイル名
上記のコマンドを順に説明していきます。
classpathを指定してファイルの参照先を指定する
まずファイルをコンパイルするため「javac」コマンドを利用し、オプションとして「-cp(クラスパス)」を指定しています。
「-cp」は「-classpath」の略称で、別階層の複数ファイルをコンパイルする場合にはJavaのコンパイラに参照先を教えてあげるためのコマンドです。
参照先ディレクトリを複数指定するためには「:」で区切って指定する
まず最初の「.」の意味は、カレントディレクトリ(現在のフォルダ)を意味します。
最後に指定しているファイルが存在するディレクトリでコマンドを実行します。
次に「:」ですが複数のディレクトリを指定するためにはディレクトリ毎に「:」で区切る必要があります。
サンプルコードで確認しよう
複数ファイルに分かれたJavaプログラムを実行する方法についてもサンプルコードで確認しておきましょう。
まずは「Main.java」「Sub1.java」「Sub2.java」「Sub3.java」の4つファイルを用意します。
Main.java
import java.util.*; public class Main { public static void main(String[] args) throws Exception { Sub1 sub1 = new Sub1(); Sub2 sub2 = new Sub2(); System.out.println(sub1.content); System.out.println(sub2.content); } }
Sub1.java
public class Sub1 { String content = "ポテパンSub1クラス"; }
Sub2.java
public class Sub2 { String content = "ポテパンSub2クラス"; }
Sub3.java
public class Sub3 { String content = "ポテパンSub3クラス"; }
今回のサンプルコードでは「Document」フォルダの配下に「sample」フォルダを用意し、「Main.java」「Sub1.java」「Sub3.java」ファイルを格納しています。
更に、「sample」フォルダ配下に「sampleSub」フォルダを作成し、「Sub2.java」ファイルが格納されている状態です。
下記の画像でご確認ください。
ではまずコンパイルを下記のコマンドで行います。
コマンドを実行するフォルダは「Document」配下の「sample」フォルダです。
javac -cp .:sampleSub/ Main.java
実行した結果が下記の画像のようになります。
「Main.java」から呼び出されていない「Sub3.java」についてはクラスファイルが作成されていないことがご確認頂けます。
実際に実行してみましょう。
java -cp .:sampleSub/ Main
複数階層のフォルダを参照する必要がある場合には、実行時にも「-cp」オプションでフォルダ指定することに注意してください。
実行結果が下記の画像となります。
さいごに:コマンドからのJava実行方法を学んで基本的な仕組みを理解しよう!
本記事では、Mac環境でのターミナルからJavaを実行する方法についてご紹介してきました。
IDEでの開発が一般的となってきた昨今、Javaを実行する仕組みを理解せずにプログラミングを行っているJavaプログラマーも少なからずいらっしゃいます。
コマンドラインでのJava実行方法を学び、基本知識を身につけることでIDEでの開発を行う際にもより深く理解して作業することが出来ますので、ぜひ今回ご紹介した方法を一度ご自身でも試して理解を深めてください。
参照する必要があるディレクトリを全て指定してコンパイルを行いましょう。