コンソール アプリケーション

コンソール アプリケーションはコマンドプロンプトや PowerShell 上での実行に適したテキストベースのアプリケーションです。Command Line Interface CLI アプリケーションや Character User Interface CUI アプリケーションと呼ばれることもあります。

オプション -g および -s のいずれも指定しない場合 コンソール アプリケーションになります。

コマンドプロンプト
C:¥>exewrap ConsoleSample1.jar

コンソール アプリケーションの特徴

  • Unicode 固有の文字をコンソールに出力することができます。

  • スレッドが異常終了した場合 スタックトレースを出力してアプリケーション プロセスを終了させます。マルチスレッド アプリケーションで一部のスレッドが異常終了したまま動作が続行されてしまう危険性がなくなります。拡張フラグ IGNORE_UNCAUGHT_EXCEPTION を指定するとこの機能を無効にすることができます。

簡単なプログラムを作ってみよう

コンソールに文字を表示する簡単なプログラムを作って EXE にしてみましょう。

以下のソースコードを ConsoleSample1.java というファイル名で作成します。

ConsoleSample1.java
public 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.MF
Manifest-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.java
import 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 フォルダーには他にもサンプルコードがあります。ぜひ試してみてください。


次は exewrap の様々な機能について見ていきましょう。