java.exeとjavaw.exeの違い、その原理から説明してみる

2018年8月9日

あまりちゃんと考えもせずに利用してきたのだが。。。何年Javaを使ってるんだという話なのだが、これまできちんと頭の中を整理したことが無かった。それは、なぜjava.exeとjavaw.exeの二つがあるのかということだ。もちろんこれはWindowsの話なのだが、他も同じだろう。

以下に議論がある。

そもそも話

これは、少々歴史をひもといていかないとわからないと思う。大昔のコンピュータというのは、そもそもウインドウシステムがなかった。キャラクタユーザインターフェースのみだったのである。Windowsで言えば、コマンドプロンプトだけということだ。これはまさに大昔のMSDOSの画面そのものだ。つまり、これである。

この中で何でもかんでもやっていたのだが、「やる」とは言っても、基本的には文字を入力して、文字が出力されるというそれだけのことだ。そして、それらの文字が上の方に流れ去っていくという形になる。

その後で、ウインドウシステムが登場し。。。余談だが、これはMacが最初だなどという人がいるのだが、間違いだ。そもそもは、コピー機で有名なゼロックスのパロアルト研究所で作られていたものをスティーブ・ジョブズが見て感激し、それを真似して作ったものなのである。

当時のゼロックスはかなり先を見越していた。つまり、「紙の時代は終わりになる」などと、1970年代あたりから危機感を持っており、それがためにウインドウシステムやらオブジェクト指向の考え方を開発していたのである。

ともあれ、ウインドウシステムが使われだしたのは、かなり後の話で、それ以前は「コマンドプロンプト」のようなCUIシステムしかなく、文字を入力して文字を出力するというアプリだった。これをコンソールアプリケーションなどと呼ぶ。

それがウインドウシステムの登場により、そのような画面は不要になったのである。ウインドウアプリケーションには、当然そういった画面は不要だ。

java.exeはコンソールアプリケーション

ここまで来るとわかると思うのだが、java.exeはコンソールアプリなのである。基本的に、文字を入力し文字が出力されるという利用形態を前提としている。もちろん、そのプログラムの中でウインドウを表示してしまっても構わないのだが、コンソールつまりコマンドプロンプト画面が消えることは無い。

そして、java.exeの上で起動したJavaアプリが終了するのを待ち続ける。仕事が終了もせずに、次の仕事にとりかかることはない。同時に複数のJavaアプリを起動してしまえば、入力と出力がごちゃごちゃになってしまうからだ。

ともあれ、java.exeが起動する場合、そこには必ずコンソール、コマンドプロンプト画面を必要とする。

javaw.exeはウインドウアプリケーション

これに対して、javaw.exeの方はウインドウアプリケーション用のコマンドである。javaw.exeで起動した場合、起動されたアプリは独自のウインドウを必ず持つという前提になっているため、コンソールは必要無いし、コンソールでの入出力は行われないので「アプリの終了を待つ」という概念も無い。

だから、実行形式のjarファイルをダブルクリックして動作させた場合、呼ばれるのはjavaw.exeになる。「ダブルクリックで起動しているのだから、当然ウインドウアプリだろう」というわけだ。

実際にやってみる

これは実際にやってみると、かなり良くわかる。例えば今Javaのウインドウアプリケーション実行形式jarのsample.jarがあるとし、コマンドプロンプトを開き、そこで以下のように起動してみる。

java -jar sample.jar

もしくは

javaw -jar sample.jar

前者はプログラムの実行終了を待つため、終了しなければ次のことができないのだが、後者は待たないので、ただちに次のことができてしまう。