―Javaプログラミングの前提知識―

前田俊行
2001/5/12
Javaプログラミング
ワンポイントレクチャーについて

   javaコマンドを使いこなす

今回の内容
基本的なjavaコマンドの使い方
実行を指定できるクラス、できないクラス

javaコマンドのオプションを活用する

 javaコマンドはクラスファイルを実行するツールです。javacコマンドなどでソースファイルからコンパイルしたクラスファイルは、すべてこのjavaコマンドを介して実行されます。

 クラスファイルとは、コンピュータ固有の環境(CPUなど)とは完全に独立した仮想的なコンピュータ、Java Virtual Machine(Java VM)上の実行ファイルのことです。javaコマンドは、このクラスファイルを実行するために、まずJava VMを起動します。起動したJava VMは、javaコマンドに指定されたクラスファイルを読み込み、その実行を開始します。以下では、このjavaコマンドの使い方について説明します。

 なお、javaコマンドは基本的に、DOSプロンプトまたはコマンドプロンプト上で実行します。

 基本的なjavaコマンドの使い方

■クラスの実行

 javaでクラスを実行する方法は簡単です。DOSプロンプトまたはコマンドプロンプト上で、実行するクラスファイル名を指定してjavaコマンドを実行するだけです。例えば、カレントディレクトリ中に、クラスファイルWordProcessor.classと、その実行に必要なクラスファイルがすべて存在するときに、クラスWordProcessorを実行するには、次のように入力します。

java WordProcessor

 すると、Java VMが起動し、そのJava VMがクラスファイルWordProcessor.classを読み込み、実行を開始します。

■クラスパスの指定

 クラスパスは、アプリケーションを実行するのに必要なクラスファイルをJava VMがどの"場所"から読み込めばよいかを指定するものです。

 Java VMにクラスパスを指定するには、javaコマンドでクラスファイルを実行するときに、次のように入力します。

java -classpath <クラスパス> <実行するクラス名>

 クラスパスは、記号“;”(セミコロン)で区切られた複数の“場所”の指定から構成されます。“場所”には、具体的には、まずディレクトリが指定できます。そのほかにも、ZIPファイルとJARファイルという、複数のクラスファイルを1つにまとめたファイルを指定することができます。大抵のJavaのクラスライブラリはJARファイルで配布されるので、“場所”にこの種類のファイルを指定できるようになっています。例えば、カレントディレクトリ中のクラスWordProcessorが、その内部でディレクトリC:\lib中のクラスライブラリSpellChecker.jarを利用しているとします。ここで、SpellChecker.jarはJARファイル、すなわち複数のクラスファイルを1つのファイルにまとめたものです。このとき、クラスWordProcessorを実行するには、

java -classpath .;C:\lib\SpellChecker.jar WordProcessor

のように入力し、Java VMがクラスライブラリSpellChecker.jarの中身を検索できるようにしなければなりません(“.”はカレントディレクトリを表します)。さもなければ、Java VMは実行に必要なクラスファイルを見つけることができず、

Exception in thread "main" java.lang.NoClassDefFoundError: <クラス名>

のようなエラーメッセージを表示して終了してしまいます。クラスパスの指定で間違えがちなのが、カレントディレクトリの指定です。例えば、上の例で、次のようにカレントディレクトリをクラスパスに指定し忘れたとします。

java -classpath C:\lib\SpellChecker.jar WordProcessor

 この場合に、Java VMはカレントディレクトリを検索しないので、クラスWordProcessorを見つけることができず、やはりエラーメッセージを表示して終了してしまいます。

 なお、この-classpathオプションを指定せずにjavaコマンドを実行した場合には、Java VMは自動的にクラスパスをカレントディレクトリに指定します。クラスパスについての詳細は、「クラスパス(class path)を正しく使う」を参照してください。

 なお、標準システムクラスライブラリや、エクステンションメカニズムでインストールしたクラスライブラリを利用する場合には、それらのクラスへのクラスパスを指定する必要はありません。詳しくは、「クラスパス(class path)を正しく使う」、「クラスパスを使わずクラスライブラリを利用する」を参照してください。

 実行を指定できるクラス、できないクラス

 Java VMは実行を開始すると、まず最初にjavaコマンドで直接指定されたクラスの

public static void main(String[])

 というメソッドを呼び出します。このメソッドが存在しないクラスはjavaコマンドに直接指定することはできません。もし実行しようとするクラスにpublic static void main(String[] )というメソッドが存在しなければ、Java VMは、

Exception in thread "main" java.lang.NoSuchMethodException: main

 というようなエラーメッセージを表示して終了します。

 javaコマンドのオプションを活用する

 以下ではjavaコマンドに指定できるコマンドラインオプションについて説明します。

 非常に多くのオプションがありますが、すべてのオプションについて知っている必要はありません。普通にクラスファイルを実行するだけならば、-classpathオプションの使い方を知っていれば十分です。

■標準オプション

●javaコマンドの使い方を表示する
“-?”または“-help”
これらのオプションを指定すると、javaコマンドは、javaコマンドの簡単な使い方を表示して、終了します。これは、オプションもクラスファイル名も何も指定せずにjavaコマンドを実行したときと同じです

●クラスパスを指定する

-classpath <記号";"で区切られた複数のディレクトリ、JAR、ZIPファイル>

このオプションを用いることで、Java VMのクラスパスを指定することができます。クラスパスについては、「クラスパス(class path)を正しく使う」を参照してください


●Java VMのバージョンを表示させる(終了時)
-version
このオプションを指定すると、javaコマンドはJava VMのバージョンを表示して終了します

●Java VMのバージョンを表示させる(実行前)

-showversion

このオプションを指定すると、クラスファイルの実行前に、javaコマンドはJava VMのバージョンを表示します。

●実行中に読み込むクラスファイルを表示させる

“-verbose” または“ -verbose:class”

これらのオプションを指定すると、Java VMは実行中にクラスファイルを読み込むたびに、メッセージを表示します

●ガーベッジコレクションの実行を知らせるメッセージを表示させる

-verbose:gc
このオプションを指定すると、Java VMはガーベッジコレクションを行うたびに、メッセージを表示します。ガーベッジコレクションとは、利用されなくなったオブジェクトをヒープから取り除くことです

●JNIの使用時にメッセージを表示させる
-verbose:jni
このオプションを指定すると、Java VMはJava Native Interface(JNI)が使用されるたびに、メッセージを表示します。JNIとは、CPUまたはオペレーティングシステムに固有の実行コード、ネイティブコードをJava VMからアクセス、実行するためのインターフェイスです。逆に、JNIにより、ネイティブコードからJava VMにアクセスしたり、実行することができます

●非標準オプションの内容を表示させる
-X
このオプションを指定すると、非標準オプションについての説明が表示されます。非標準オプションについては以下の"非標準オプション"の説明を参照してください

●JARファイルの実行を指定する

-jar

このオプションを用いて、javaコマンドにクラスファイルではなくJARファイルを指定すると、Java VMはそのJARファイルから直接実行するクラスを読み込んで、実行することができます。この機能を用いるためには、JARファイルにどのクラスを最初にJava VMで実行すればよいかの情報を追加しておく必要があります。ここでは、その詳細については説明しません

■非標準オプション

 非標準オプションは、サン以外(マイクロソフト、IBMなど)のJava VMの実装では指定できる保証のないオプションです。また、将来のバージョンの実装では、これらのオプションが使用できなくなる可能性があります。


●実行効率を最適にする(JITを有効にする)

-Xmixed

このオプションを用いると、Java VMはバイトコードインタプリタとネイティブコードコンパイラの両方を使って、最も実行効率がよくなるように、クラスファイルを実行します。Java VMは通常このように動作するので、特にこのオプションを指定する必要はありません。

バイトコードインタプリタとは、クラスファイルに書かれているJava VMの命令を1命令ずつ読み込んで実行するプログラムです。

ネイティブコードコンパイラとは、クラスファイルに書かれているJava VMの命令を読み込んで、それに対応するCPUの機械命令を生成するプログラムです。


●インタプリタで実行する

-Xint

このオプションを用いると、Java VMはバイトコードインタプリタのみを用いてクラスファイルを実行します。

●外部のデバッガからのデバッグを有効にする

-Xdebug

このオプションを指定すると、Java VMは、外部のデバッガからデバッグを行えるようになります。


●ブートクラスパスを指定したものに変更

-Xbootclasspath:<ブートクラスパス>

ブートクラスパスを指定したものに変更します。ブートクラスパスについては、「クラスパス(class path)を正しく使う」を参照してください。


●ブートクラスパスを追加(最後に)

-Xbootclasspath/a:<追加するブートクラスパス>

ブートクラスパスの最後に、指定したブートクラスパスを追加します。


●ブートクラスパスを追加する(先頭に)

-Xbootclasspath/p:<追加するブートクラスパス>

ブートクラスパスの先頭に、指定したブートクラスパスを追加します。


●より厳密なクラスファイルのチェックを行う

-Xfuture

このオプションを指定すると、Java VMはクラスファイルのチェックを正しいクラスファイルフォーマットの仕様に沿って厳密に行います。このオプションを指定しないと、Java VMは古いJava VM(バージョン1.1時代)のクラスファイルチェックを行います。

クラスファイルのチェックの方法は、Java VMのバージョンが1.1から1.2に上がったときに、より、厳密に行うことに、いったん決まりました。ところが、実際に厳しくチェックしてみると、その当時、すでに存在していたJavaアプリケーションが実行できなくなることが意外と多かったので、方針を転換して、標準ではクラスファイルのチェックは仕様に厳密に行わないことにして、-Xfutureオプションを指定したときのみ、厳密にチェックするようになりました。将来のJava VMでは、この厳密なチェックが標準になるそうです。


●ガーベッジコレクションを無効にする

-Xnoclassgc

このオプションを指定すると、Java VMは、クラスのガーベッジコレクションを行いません。


●ガーベッジコレクションのプログラム実行への影響を小さくする

-Xincgc

このオプションを指定すると、Java VMは“インクリメンタルガーベッジコレクション”という方法の、ガーベッジコレクションを行います。この方法では、プログラムの実行中に、ガーベッジコレクションが発生してプログラムの実行が妨害されることがなくなります。ただし、ガーベッジコレクションそのものの性能は約10%低下するそうです


●Java VMのヒープの初期サイズを指定する

-Xms<ヒープサイズ(バイト)>

このオプションで、Java VMのヒープの初期サイズをバイト単位で指定することができます。このオプションで指定するヒープのサイズは、1024の倍数でかつ、1メガバイト以上でなければなりません。このオプションでは、キロバイトを表すのに記号“k”を、メガバイトを表すのに記号“m”を用いることができるので、これらを用いると1024の倍数を計算することなくヒープのサイズを指定することができます。例えば、ヒープの初期サイズを1024キロバイトに指定するには、次のように入力します。

java -Xms1024k

●Java VMのヒープの初期サイズを指定する

-Xmx<ヒープサイズ(バイト)>

このオプションで、Java VMのヒープの最大サイズをバイト単位で指定することができます。このオプションで指定するヒープのサイズは、1024の倍数でかつ、2メガバイト以上でなければなりません。

このオプションでは、キロバイトを表すのに記号“k”を、メガバイトを表すのに記号“m”を用いることができるので、これらを用いると1024の倍数を計算することなくヒープのサイズを指定することができます。例えば、ヒープの最大サイズを256メガバイトに指定するには、次のように入力します。

java -Xmx256m

●プログラム終了時にCPUの簡単なプロファイリング結果を表示

-Xprof

このオプションを指定すると、Java VMは、実行終了時に、非常に簡単なCPUのプロファイリング結果を表示します。


●プログラム終了時にCPUの詳細なプロファイリング結果を表示

-Xrunhprof

このオプションを指定すると、Java VMの実行を詳細にプロファイリングすることができます。このオプションの詳しい使い方は、

java -Xrunhprof:help

と入力すると表示されますので、それを参照してください。



Javaプログラミング・ワンポイントレクチャー INDEX





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間