Javaは数あるプロラミング言語の中でも、幅広い分野で多く使われている言語で、組み込みアプリケーションやスマホアプリ、Webアプリなど、用途は多岐に渡ります。
この記事では、普段は eclipse などの統合開発開発環境を使っていて、あまり意識しないが、Java のソースコードをコンパイルしたり、実行したりする上で重要な Java コマンドについて解説します。
Javaコマンドとは?
前述のように、Java コマンドとは Java アプリケーションのコンパイルや起動するためのコマンドだ。
主に Java ソースをコンパイルする時はjavacコマンド、Java アプリケーションを実行するときはjavaコマンドを用います。
「javac」コマンドでソースコードをコンパイル
まず、コンパイルするためのソースコードを準備します。
次のコードは、コンソール上に「Hello Java」と表示する基本のサンプルコードです。テキストエディタ等で次の内容をコピーして、「Main.java」というファイル名で保存しましょう。
class Main {
public static void main(String args[]){
System.out.println("Hello Java!");
}
}
ファイルの準備ができたら、作成した Java コードをコンパイルしましょう。
コンパイルというのは簡単にいえば、ソースコードをコンピュータが読めるような言語に翻訳する操作のことです。
ターミナル(Windowsの場合はコマンドプロンプト)を起動し、サンプルコードを作成したディレクトリを表示します。
cd <ファイルを作成したディレクトリ>
次に、javacコマンドでコンパイルを行います。
javac Main.java
コンパイルが正常に終了すると、同じディレクトリに「Main.class」という名前でクラスファイルが生成されます。
外部ファイルを読み込むには?
実際のアプリケーション開発では、単一のJavaのソースコードで完結することはなく、外部のライブラリなどを読み込む必要があり、その場合は、オプション指定して参照先のクラスファイルやJARファイルを指定します。
javacコマンドの使用方法は、次のようにjavac -helpと入力することで、コマンドの使用方法をコンソール上に出力できます。
$ javac -help
使用方法: javac <options> <source files>
使用可能なオプションには次のものがあります。
-g すべてのデバッグ情報を生成する
-g:none デバッグ情報を生成しない
-g:{lines,vars,source} いくつかのデバッグ情報のみを生成する
-nowarn 警告を発生させない
-verbose コンパイラの動作についてメッセージを出力する
-deprecation 非推奨のAPIが使用されているソースの場所を出力する
-classpath <path> ユーザー・クラス・ファイルおよび注釈プロセッサを検索する位置を指定する
(以降省略)
例えば、ログ出力のライブラリとしてよく用いられる「log4j」をクラスパスに指定して、Javaのソースコードをコンパイルする場合は、次のようなコマンドを使用します。
$ javac -classpath c:\jakarta-log4j-1.2.8\dist\lib\log4j-1.2.8.jar Main.java
クラスパスはファイル名を完全パスで指定する方法の他に、ワイルドカードを使用して、複数まとめて指定することが可能です。
例えば「lib」フォルダ直下にある、.classファイルやJARファイルなどの外部依存のライブラリなどを、まとめて指定する場合は、次のように-classpathオプションを指定します。
javac -classpath 'lib/*:lib/sublib/*' Main.java
「Javaコマンド」でアプリを実行
コンパイルができたら、次は「java」コマンドを使用して作成したJavaアプリケーションを実行してみます。
上で作成したクラスファイル(Main.class)を実行して、コンソール上に「Hello Java」と表示させてみます。
cd <クラスファイルを作成したディレクトリ>
java Main
実行すると、次のようにコンソールに「Hello Java」の文字が出力されれば成功です。
Hello Java
外部ファイルを読み込む
javacでコンパイルする時も同様でしたが、作成したアプリケーションが外部のクラスやライブラリ(JAR)に依存している場合は、実行時に-classpathオプションで外部ライブラリのパスを指定してあげる必要があります。
java -classpath path/to/lib Main
また、-classpathオプションは省略して次のように-cpオプションとして書くこともできます。
java -cp path/to/lib Main
引数を渡してJavaを実行する
コマンドで Java アプリケーション実行する時に、引数を指定できます。
まず、サンプルコードを次のように編集して、渡された引数の情報をコンソールに表示できるようにします。
class Main {
public static void main(String[] args){
for (int i = 0; i < args.length; i++) {
System.out.println(String.valueOf(i) + ":" + args[i]);
}
}
}
引数は、javaコマンドの末尾に指定します。また複数の引数を指定する時はスペースで区切って指定します。
引数を2つ指定して Java コマンドを実行する場合は、次のように記述します。
java Main Java Python
複数のクラスまとめたJARファイルを作成する
アプリケーションの規模が大きくなるにつれて、javacでコンパイルするクラスの数も多くなってきます。Java は分割コンパイルする言語であるため、Java のクラス1つにつき、クラスファイル(.class)が作成され、大規模なシステムであれば数千個以上のクラスファイルが作成されることが大いにあります。
分割コンパイルによるメリットもありますが、ひとつのプログラム(システム)はひとつのファイルにまとまっていた方がバージョン管理や配布をするときに便利です。
こういう時のために、Javaではjarコマンドを使用して複数のクラスファイルやリソースファイルをまとめて Java アーカイブ (JAR ファイル, *.jar)として、ひとつのファイルにパッケージできます。
jarコマンドの使い方
実際にjarコマンドを使用して、複数のクラスファイルをまとめて1つの JARファイルを作ってみましょう。
まず、次の2つのクラスを作成・コンパイルし、クラスファイルを生成しておきます。
//「Person.java」
package myapp;
public class Person {
private String name;
public Person(int age, String name) {
this.age = age;
}
}
//「Main.java」
package myapp;
public class Main {
public static void main(String args[]){
Person person = new Person();
}
}
クラスファイルの準備ができたら、次のjarコマンドを実行し、2つのクラスファイルを1つのJARファイルにまとめます。
jar cfe MyApp.jar Main *.class ./myapp/*.class
まとめ
Javaのコマンドを使用して、ソースコードをコンパイルする方法や、アプリを実行する方法などを解説してきました。
普段は eclipse などの統合開発開発環境(IDE)を使って効率的に開発した方がよいため、あまりコマンドを利用するシーンは少ないかもしれませんが、時には統合開発環境(IDE)が使えない時もあるため、今回紹介したコマンドの存在について、是非知っておきましょう。
クラスファイル(.class)とは、Javaで書かれたソースコードを、コンピュータが分かる言語に置き換えたファイルで、Java仮想マシン (JVM) はこのクラスファイルを読み込みプログラムを実行します。