コンソール・アプリケーション
コンソール ・ アプリケーションはコマンドプロンプトや PowerShell 上での実行に適したテキストベースのアプリケーションです。Command Line Interface (CLI) アプリケーションや Character User Interface (CUI) アプリケーションと呼ばれることもあります。
オプション -g
および -s
のいずれも指定しない場合、 コンソール ・ アプリケーションになります。
コマンドプロンプトC:¥>exewrap ConsoleSample1.jar
コンソール・アプリケーションの特徴
Unicode 固有の文字をコンソールに出力することができます。
スレッドが異常終了した場合、 スタックトレースを出力してアプリケーション ・ プロセスを終了させます。マルチスレッド ・ アプリケーションで一部のスレッドが異常終了したまま動作が続行されてしまう危険性がなくなります。拡張フラグ
IGNORE_UNCAUGHT_EXCEPTION
を指定するとこの機能を無効にすることができます。
簡単なプログラムを作ってみよう
コンソールに文字を表示する簡単なプログラムを作って EXE にしてみましょう。
以下のソースコードを ConsoleSample1.java
というファイル名で作成します。
ConsoleSample1.javapublic class ConsoleSample1 {
public static void main(String[] args) {
if(args.length == 0) {
System.out.println("Hello, World!!");
} else {
for(int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}
}
コマンドプロンプトを起動します。Java コンパイラ (javac) と exewrap が使えるように PATH 環境変数を設定しておいてください。
javac
コマンドでソースコード ConsoleSample1.java
をコンパイルすると ConsoleSample1.class
ファイルが出来上がります。
コマンドプロンプトC:¥>javac ConsoleSample1.java
出力された ConsoleSample1.class
ファイルを実行可能な Java アーカイブ形式 (jar) にまとめます。実行可能 JAR ファイルを作成するときはエントリーポイントとなるメインクラスを記述したマニフェストファイルが必要になります。
本来は以下のようなマニフェストファイルを作成するのですが、 メインクラスの指定のみであればマニフェストファイルを作成せずに jar
コマンドの引数でメインクラスを指定することもできます。
MANIFEST.MFManifest-Version: 1.0
Main-Class: ConsoleSample1
今回はマニフェストファイルを用意せずに引数でメインクラスを指定します。jar
コマンドの引数 e
がメインクラスを指定するオプションです。引数の ConsoleSample1
がメインクラスの指定です。
コマンドプロンプトC:¥>jar cfe ConsoleSample1.jar ConsoleSample1 ConsoleSample1.class
マニフェストファイルで指定する場合は m
オプションを使って以下のようにします。
コマンドプロンプトC:¥>jar cfm ConsoleSample1.jar MANIFEST.MF ConsoleSample1.class
最後に exewrap
で ConsoleSample1.jar
を実行ファイル (EXE) にします。
コマンドプロンプトC:¥>exewrap ConsoleSample1.jar exewrap 1.6.0 for x64 (64-bit) Architecture: x64 (64-bit) Target: Java 5.0 (1.5.0.0) ConsoleSample1.exe (64-bit) version 0.0.0.0
実行ファイルには製品名や著作権表示、 バージョンなど様々なプロパティ情報を指定することができます。詳細については 「基本オプション」 を参照してください。
実行ファイルが出来上がりました。
実行してみましょう。
コマンドプロンプトC:¥>ConsoleSample1.exe Hello, World!!
引数に適当な文字列を指定すると、 指定した文字列がそのまま出力されます。
コマンドプロンプトC:¥>ConsoleSample1.exe こんにちは こんにちは
上手くいきましたね!
プロセスの二重起動を禁止する
exewrap には java.exe
ではできないいくつかの拡張機能があります。拡張機能の 1 つアプリケーションの二重起動禁止を試してみましょう。
以下のソースコードを ConsoleSample2.java
というファイル名で作成します。今回のソースコードには日本語が含まれていますので文字コードは UTF-8 として保存しましょう。
ConsoleSample2.javaimport java.io.IOException;
public class ConsoleSample2 {
public static void main(String[] args) throws IOException {
System.out.println("Hello, World!!");
System.out.println("Enterキーを押すと終了します。");
System.in.read();
}
}
コンパイルして実行可能 JAR にまとめる手順は先程と同様です。javac
コマンドにはソースコードの文字コードを指定する -encoding UTF-8
を追加しています。文字コードを指定しない場合、 ソースコードは Shift_JIS (MS932) と見なされます。
コマンドプロンプトC:¥>javac -encoding UTF-8 ConsoleSample2.java C:¥>jar cfe ConsoleSample2.jar ConsoleSample2 ConsoleSample2.class
exewrap
で ConsoleSample2.jar
を実行ファイル (EXE) を作成します。このとき、 -e
オプションを使って二重起動を禁止する拡張フラグ SINGLE
を指定します。(詳細については 「拡張フラグ」 を参照してください。)
コマンドプロンプトC:¥>exewrap -e SINGLE ConsoleSample2.jar exewrap 1.6.0 for x64 (64-bit) Architecture: x64 (64-bit) Target: Java 5.0 (1.5.0.0) ConsoleSample2.exe (64-bit) version 0.0.0.0
実行ファイルが出来上がりました。この実行ファイルは二重起動ができないようになっています。
実行してみましょう。
コマンドプロンプトC:¥>ConsoleSample2.exe Hello, World!! Enterキーを押すと終了します。
「Enter キーを押すと終了します」 とメッセージが表示されプロンプトには復帰しません。System.in.read()
で入力待ち状態になっているからです。
この状態のまま、 もう 1 つコマンドプロンプトを起動して ConsoleSample2.exe
を実行してみます。
コマンドプロンプトC:¥>ConsoleSample2.exe 要求されたリソースは使用中です。 C:¥>
2 つ目に実行した ConsoleSample2.exe
は 「要求されたリソースは使用中です」 と表示してすぐプロンプトに復帰しました。二重起動が禁止されているからですね。この二重起動の判定は JavaVM の起動前に行われるため、 Java コードで二重起動チェックを実装するよりもずっと効率的です。
なお、 二重起動のチェックに引っかかった後発のプロセスの終了コードは 170 になります。
コマンドプロンプトC:¥>echo %ERRORLEVEL% 170
exewrap の配布物に含まれている samples
フォルダーには他にもサンプルコードがあります。ぜひ試してみてください。