exewrap
exewrap は実行可能 JAR ファイルから EXE ファイルを生成するツールです。Windows 環境で Java アプリケーションを簡単に起動できるようにします。
exewrap はネイティブ ・ コードにコンパイルするツールではありません。launch4j や JSmooth と同じように Java アプリケーションの起動を用意にするツールです。
- 2024-12-16 バージョン 1.6.6
- アプリケーション ・ マニフェスト dpiAware=true, dpiAwareness=system に修正しました。
特徴
- x64 (64-bit) 用 EXE ファイルを生成することができます。x86 (32-bit) にも対応しています。
- タスクマネージャーに
java.exe
、javaw.exe
ではなく EXE ファイル名が表示されます。 - 一時ファイルを出力しません。クラスファイルや画像リソースは直接メモリにロードされます。
- ウィンドウ ・ アプリケーションは スプラッシュスクリーン 表示に対応しています。
- Windows サービスを作成することができます。
- 生成される EXE ファイルのサイズは、 JAR ファイルのサイズ
+60KB
と軽量です。 - ユーザー アカウント制御 (UAC) による権限昇格に対応しています。
- Java アプリを UWP 化 (デスクトップ ・ ブリッジ) して Microsoft ストアで配布できます。
- 他にも便利な機能が用意されています。
ライセンス
exewrap は BSD ライクなライセンスを採用しています。BSD ライセンスの条項に加えて、 生成された EXE ファイルの利用には一切の制限が課されないことを明記しています。
Copyright (C) 2005-2020 HIRUKAWA Ryo. All rights reserved.
ソースコード形式であれバイナリ形式であれ、 変更の有無に関わらず、 以下の条件を満たす限りにおいて、 再配布および使用を許可します。
- ソースコード形式で再配布する場合、 上記著作権表示、 本条件書および下記責任限定規定を必ず含めてください。
- バイナリ形式で再配布する場合、 上記著作権表示、 本条件書および下記責任限定規定を、 配布物とともに提供される文書 および/または 他の資料に必ず含めてください。
本ソフトウェアの実行により生成されたファイルの利用および配布について一切の制限を行いません。上記著作権表示、 条件書、 下記責任限定規定を含まずに、 本ソフトウェアの実行により生成されたファイルを完全に自由に利用および配布することができます。
本ソフトウェアは HIRUKAWA Ryo によって、 “現状のまま” 提供されるものとします。本ソフトウェアについては、 明示黙示を問わず、 商品用として通常そなえるべき品質をそなえているとの保証も、 特定の目的に適合するとの保証を含め、 何の保証もなされません。事由のいかんを問わず、 損害発生の原因いかんを問わず、 且つ、 責任の根拠が契約であるか厳格責任であるか (過失その他) 不法行為であるかを問わず、 HIRUKAWA Ryo も寄与者も、 仮にそのような損害が発生する可能性を知らされていたとしても、 本ソフトウェアの使用から発生した直接損害、 間接損害、 偶発的な損害、 特別損害、 懲罰的損害または結果損害のいずれに対しても (代替品またはサービスの提供;使用機会、 データまたは利益の損失の補償;または、 業務中断に対する補償を含め) 責任をいっさい負いません。
ダウンロード
アプリケーションの種類
exewrap では、 コンソール ・ アプリケーション、 ウィンドウ ・ アプリケーション、 Windows サービス ・ アプリケーションの 3 種類のアプリケーションを作成することができます。
機能
オプション
外部ライブラリの読み込み
exewrap で作成されたアプリケーションは、 アプリケーションの実行ファイル (EXE) のあるディレクトリに、 lib
ディレクトリが存在する場合、 lib
ディレクトリ (およびサブディレクトリ) を自動的にクラスパスに追加します。JDBC ドライバなどの外部ライブラリは、 アプリケーションファイル (EXE) と同じ場所に lib
ディレクトリを作成し、 そのディレクトリ内に配置することができます。また、 lib
ディレクトリには DLL を配置することもできます。
- オプション
-L
で、 外部ライブラリの読み込みディレクトリを変更することができます。 - オプション
-L
ではセミコロン(;
)で区切ることで複数のディレクトリを指定することができます。 - サブディレクトリも再帰的に対象となります。
JRE検索
exewrap で作成されたアプリケーションは、 アプリケーションの実行ファイル (EXE) のあるディレクトリに、 jdk
または jre
で始まるディレクトリが存在する場合、 jdk
または jre
で始まるディレクトリを Java 実行環境として使用します。この方法を利用すると、 システムに JRE がインストールされていない環境でも jdk
または jre
で始まるディレクトリを単純にコピーするだけでアプリケーションを実行できるようになります。
jdk
ディレクトリはjre
ディレクトリよりも優先されます。jdk
ディレクトリだけでなく、jdk-8u40
のようなバージョン付きディレクトリも検索対象となります。jre
ディレクトリだけでなく、jre1.8.0_40
のようなバージョン付きディレクトリも検索対象となります。jdk
およびjre
で始まるディレクトリが存在しない場合は、 環境変数JAVA_HOME
を Java 実行環境として使用します。- 環境変数
JAVA_HOME
も定義されていない場合は、 レジストリを参照してシステムにインストールされている JRE を検索します。 - 上記いずれの条件にも該当せず、
PATH
環境変数によってjava.exe
が実行可能な場合、java.exe
のある場所を Java 実行環境とします。
オプション -l
で Java 実行環境の検索方法を制限することもできます。指定できる値は APPDIR
、 PARENTDIR
、 JAVAHOME
、 REGISTRY
、 PATHENV
、 JARASSOC
です。複数の値を指定する場合はセミコロン ;
で値を区切ってください。
フラグ | 説明 |
---|---|
APPDIR | 実行ファイルと同じフォルダーから jdk/jre フォルダーを検索します。 |
PARENTDIR | 実行ファイルの親フォルダーから jdk/jre フォルダーを検索します。 |
JAVAHOME | 環境変数 JAVA_HOME で指定されたフォルダーを参照します。 |
REGISTRY | レジストリーから Java のインストール ・ フォルダーを参照します。JavaSoft (Oracle) 版および AdoptOpenJDK など Oracle 互換レジストリーを設定する jdk/jre が対象となります。独自のレジストリー設定をする OpenJDK を見つけることはできません。 |
PATHENV | 環境変数 PATH に java.exe のパスが含まれている場合、 そのパスを元に Java 実行環境を参照します。 |
JARASSOC | 拡張子 .jar が関連付けされている場合、 関連付けされている場所を Java 実行環境として参照します。 |
たとえば、 実行ファイルと同じフォルダーと環境変数 JAVA_HOME を検索対象とする場合は、 以下のように指定します。
コマンドプロンプトC:¥>exewrap.exe -l APPDIR;JAVAHOME myapp.jar
VMオプション・ファイル
アプリケーション実行時の VM オプションをファイルで指定することができます。アプリケーションと同じディレクトリに、 アプリケーションの実行ファイル名 + .vmoptions
という拡張子を付けたファイルを配置することで、 自動的に VM オプション ・ ファイルとして認識します。
たとえば、 作成したアプリケーションを MyApp.exe
とした場合、 同じディレクトリに MyApp.exe.vmoptions
を配置すると、 MyApp.exe
起動時に MyApp.exe.vmoptions
に記述した内容が VM オプションとして自動的に設定されます。
VM オプション ・ ファイル (*.exe.vmoptions
) には、 行ごとに 1 つの VM オプションを記述していきます。
VMオプション・ファイルの設定例
MyApp.exe
のヒープの最小値を 256MB、 ヒープの最大値を 768MB に設定する場合は以下のようなテキストファイルを用意します。
MyApp.exe.vmoptions-Xms256m -Xmx768m
- VM オプション 1 つごとに改行してください。改行せずに VM オプションを続けて記述すると正しく認識されません。
VMオプションを環境変数で設定する
VM オプション ・ ファイル (*.exe.vmoptions
) を使用する方法の他に、 環境変数で VM オプションを設定することもできます。環境変数による VM オプション指定は JavaVM の機能です。
- _JAVA_OPTIONS
_JAVA_OPTIONS
環境変数に設定されている VM オプションが JavaVM に適用されます。ここに指定した VM オプションは、 VM オプション ・ ファイル、 exewrap の-a
オプション指定よりも優先されます。環境変数名の先頭にアンダースコア (_
) が含まれることに注意してください。- JAVA_TOOL_OPTIONS
JAVA_TOOL_OPTIONS
環境変数に設定されている VM オプションが JavaVM に適用されます。ここに指定した VM オプションは優先度が低く、 VM オプション ・ ファイル、 exewrap の-a
オプション指定のほうが優先されます。環境変数名の先頭にはアンダースコアは付きません。
VMオプションにはどのようなものがありますか?
Java VM には非常に多くの VM オプションがあります。Java 8 の場合は以下のサイトが参考になります。
セキュリティ・マネージャー
exewrap で作成したアプリケーションは、 簡単にセキュリティ ・ マネージャーを有効にすることができるようになっています。アプリケーションと同じディレクトリにベースネームの同じポリシーファイルを配置することで、 自動的にセキュリティマネージャが有効になります。
たとえば、 作成したアプリケーションを MyApp.exe
とした場合、 同じディレクトリに MyApp.policy
を配置することで、 セキュリティ ・ マネージャーが有効になります。これは VM 引数 -Djava.security.manager
、 -Djava.security.policy=MyApp.policy
が指定されたのと同じ意味を持ちます。
スプラッシュ・スクリーン
exewrap は Java 6.0 から導入されたスプラッシュ ・ スクリーンに対応しています。実行可能 JAR ファイルがスプラッシュ ・ スクリーンを表示するように構成されていれば、 exewrap でも自動的にスプラッシュ ・ スクリーンが有効になります。
実行可能 JAR ファイルでスプラッシュ ・ スクリーンを表示するように構成するには、 マニフェストファイルで SplashScreen-Image
オプションでイメージのパスを指定します。SplashScreen-Image
オプションの指定については以下の URL を参照してください。
システム・プロパティ
exewrap で作成したアプリケーションは実行時に、 いくつかのシステムプロパティを自動的に設定します。
システム ・ プロパティ | 説明 |
---|---|
java.application.path | アプリケーション ・ ファイルのパスを保持しています。 |
java.application.name | アプリケーション ・ ファイルの名前を保持しています。 |
java.application.version | アプリケーションのバージョンを保持しています。 |
java.application.startup | アプリケーション ・ プロセスの開始時間を保持しています。ISO-8601 拡張形式にミリ秒精度を付加した形式で、 協定世界時 (UTC) を表わす Z が末尾に付加されています。(例 2019-09-08T04:23:11.755Z ) DateTimeFormatter のパターン文字で表わされる書式は yyyy-MM-dd'T'HH:mm:ss.SSSX です。 |
アプリケーションの完全なパスを取得するために次のコードが使用できます。
System.getProperty("java.application.path") + "¥¥" + System.getProperty("java.application.name")
exewrap 固有のプロパティを使わずにアプリケーションの実行パスを取得する方法もあります。下記サイトでは JAR ファイル、 EXE ファイルのどちらでも実行パスを取得できる汎用性の高い方法を紹介しています。
Java 8 で導入された Date and Time API を使用するとプロセスの開始時間を簡単にパースできます。
String s = System.getProperty("java.application.startup");
// UTCタイムゾーン付きの日付/時間として扱う。
ZonedDateTime zdt = ZonedDateTime.parse(s);
// ローカル日付/時間に変換して扱う。
LocalDateTime ldt = LocalDateTime.ofInstant(
Instant.parse(s), ZoneId.systemDefault());
// UNIXエポック(1970-01-01T00:00:00Z)からの経過ミリ秒数として扱う。
// System.currentTimeMillis() と比較するときに便利です。
long time = Instant.parse(s).toEpochMilli();
環境変数を設定する
Java 標準クラスライブラリには環境変数を取得する System.getenv(String name)
メソッドがあります。しかし、 環境変数を設定するメソッドは提供されていません。子プロセスに対しては ProcessBuilderのenvironment()
を使って設定することができますが、 この方法には以下の問題があります。
- 自プロセスの環境変数を設定できるわけではない
- 子プロセスの起動コードを制御できる必要がある (他者のライブラリ内で子プロセスを起動している場合に環境変数を設定するコードを追加するのは難しい)
この問題を解決するために exewrap では、 環境変数を設定するユーティリティークラス exewrap.util.Environment
を提供しています。以下のコードで環境変数を設定することができます。
Map<String, String> env;
env = (Map<String, String>) Class.forName("exewrap.util.Environment").newInstance();
env.put("NAME", "VALUE");
この環境変数を設定するコードは exewrap.util.Environment
クラスを動的に生成し Map<String, String>
インターフェースを通してアクセスしています。そのため、 ビルド時に exewrap.util.Environment
への参照を必要としません。このコードブロックを try-catch で囲い例外を無視するようにすれば、 exewrap で EXE 化していない実行可能 JAR でも実行を継続することができます。(EXE 化していない場合は環境変数が設定されないことになります。)
基本オプション
引数オプション | 説明 |
---|---|
-g | ウィンドウ ・ アプリケーションを作成します。 |
-s | Windows サービス ・ アプリケーションを作成します。 |
-A <architecture> | プログラムのアーキテクチャを指定します。x86 、 x64 を指定することができます。生成したプログラムの実行には同じアーキテクチャの Java 実行環境が必要になります。x64 バイナリを 32 ビットの Java 実行環境で実行することはできません。64 ビット版の exewrap.exe を使用している場合、 既定のアーキテクチャは x64 になります。64 ビット版の exewrap.exe を使用して 32 ビットバイナリを出力するには -A x86 を指定します。32 ビット版の exewrap.exe を使用している場合、 既定のアーキテクチャは x86 になります。32 ビット版の exewrap.exe を使用して 64 ビットバイナリを出力するには -A x64 を指定します。 |
-t <target-version> | プログラムの実行に必要な Java 実行環境のバージョンを指定します。値は内部バージョンで指定してください。つまり、 Java 5.0、 Java 6.0 はそれぞれ、 1.5 、 1.6 と指定する必要があります。 |
-l <search-flags> | Java 実行環境を検索する方法を指定します。APPDIR 、 PARENTDIR 、 JAVAHOME 、 REGISTRY 、 PATHENV 、 JARASSOC を指定できます。複数の値を指定する場合はセミコロン ; で値を区切ってください。このオプションを指定しない場合はすべての検索方法が有効になります。詳細は JRE 検索 を確認してください。 |
-M <main-class> | メインクラスを指定します。Executable JAR (実行可能 JAR) の場合はこのオプションを指定する必要はありません。 |
-L <ext-dirs> | 外部ライブラリ (JAR) の読み込みディレクトリを指定します。複数のディレクトリを指定する場合はセミコロン ; でディレクトリを区切ってください。このオプションを指定しない場合、 外部ライブラリの読み込みディレクトリとして既定で lib ディレクトリが設定されます。既定のディレクトリ lib も無効にしたい場合は -L ; としてセミコロンのみを指定してください。 |
-e <ext-flags> | 拡張フラグを指定します。詳細は 拡張フラグ を確認してください。 |
-a <vm-args> | アプリケーション実行時の VM 引数を指定します。 |
-b <vm-args> | サービス ・ アプリケーションをコマンドプロンプトなどサービス ・ コントロール ・ マネージャー (SCM) 以外から実行した場合に適用される VM 引数を指定します。 |
-i <icon-file> | EXE ファイルに指定したアイコンを埋め込みます。ICO 形式をサポートしています。BMP/PNG/GIF 形式はサポートしていません。 |
-P <privilege> | ユーザーアカウント制御 (UAC) の実行レベルを指定します。次のいずれかの値を指定することができます。 asInvoker : アプリケーションを開始したプロセスと同じアクセス許可で実行されます。管理者として実行 を選択するとアプリケーションをより高いアクセス許可に昇格させることができます。 highestAvailable : アプリケーションは可能な限り高いアクセス許可レベルで実行されます。アプリケーションを開始するユーザーが管理者グループのメンバーである場合、 このオプションは requireAdministrator と同じです。使用可能な最も高いアクセス許可レベルが、 開始したプロセスのレベルより高い場合、 資格情報の入力が求められます。 requireAdministrator : アプリケーションは管理者のアクセス許可で実行されます。アプリケーションを開始するユーザーは管理者グループのメンバーである必要があります。開始したプロセスが管理者のアクセス許可で実行されない場合は、 資格情報の入力が求められます。 |
-v <version> | EXE ファイルにファイル ・ バージョン情報を埋め込みます。バージョン指定の書式は、 メジャーバージョン、 マイナーバージョン、 リビジョン、 ビルドナンバーをピリオドで区切って指定します。リビジョンやビルドナンバーを省略することもできます。ビルドナンバーを省略して EXE ファイルを既存のファイルに上書き作成した場合、 自動的にビルドナンバーが +1 されます。 |
-d <description> | EXE ファイルに説明情報を埋め込みます。説明にはアプリケーション名やアプリケーションの機能を記述します。Windows サービス ・ アプリケーションの場合にはサービスの説明としてコントロールパネルのサービスにも表示されます。説明文に半角スペースを含める場合は、 説明全体をダブルクォーテーションで囲む必要があります(コマンドプロンプトの場合)。ant から exewrap を呼び出す場合は、 ダブルクォーテーションではなくシングルクォーテーションを使用します。 |
-c <copyright> | EXE ファイルに著作権表示を埋め込みます。オプション -d と同様に、 ダブルクォーテーションやシングルクォーテーションが必要になることがあります。 |
-C <company-name> | EXE ファイルに会社情報を埋め込みます。オプション -d と同様に、 ダブルクォーテーションやシングルクォーテーションが必要になることがあります。 |
-p <product-name> | EXE ファイルに製品名を埋め込みます。オプション -d と同様に、 ダブルクォーテーションやシングルクォーテーションが必要になることがあります。 |
-V <product-version> | EXE ファイルに製品バージョンを埋め込みます。オプション -d と同様に、 ダブルクォーテーションやシングルクォーテーションが必要になることがあります。 |
-j <jar-file> | 変換元となる実行可能 JAR ファイルを指定します。JAR ファイルはマニフェストファイルでメインクラスが指定されている必要があります。オプション -j を省略した場合、 最後の引数を JAR ファイルと見なします。 |
-o <exe-file> | 変換先となる EXE ファイルを指定します。ファイルがすでに存在している場合、 上書きされます。オプション -o を省略した場合、 変換元 JAR ファイルの拡張子を .exe に置き換えた名前でファイルが作成されます。 |
拡張フラグ
拡張フラグはアプリケーションに特別な機能を与えます。拡張フラグは -e
オプションで指定します。複数の拡張フラグを指定する場合はセミコロン ;
でフラグを区切ってください。たとえば、 拡張フラグ SINGLE
と NOLOG
を指定する場合は以下のように指定します。
コマンドプロンプトC:¥>exewrap.exe -g -e SINGLE;NOLOG SwingSet2.jar
拡張フラグ | 説明 |
---|---|
SINGLE | アプリケーションの二重起動を禁止します。既にアプリケーションが起動している状態で、 新たにアプリケーションを起動しようとした場合、 新たに起動しようとしたアプリケーションは何もせずに終了します。 |
SHARE | アプリケーションの二重起動を禁止します。すでにアプリケーションが起動している状態で、 新たにアプリケーションを起動しようとした場合、 新たに起動しようとしたアプリケーションから既に起動しているアプリケーションへ通知がおこなわれ、 既に起動しているアプリケーションの main メソッドが再度実行されます。main メソッドに渡される引数 args には、 新たに起動しようとしたアプリケーションのコマンドライン引数が設定されます。新たに起動しようとしたアプリケーションは終了します。この機能を使用すると、 二重起動を試みたときに起動済みのアプリケーションを最前面に表示したり、 ひとつの Java VM を共有してアプリケーション画面を複数起動することができます。 |
NOLOG | アプリケーションのログ出力機能を無効にします。ウィンドウ ・ アプリケーションおよびサービス ・ アプリケーションではデフォルトで標準出力、 標準エラー出力への書き込みがログファイルに出力されます。NOLOG を指定するとこのデフォルト動作が無効になります。 |
NOHELP | サービス ・ アプリケーションでヘルプメッセージを表示する -help オプション無効にします。 |
IGNORE_UNCAUGHT_EXCEPTION | スレッドでキャッチされない例外が発生しても無視します。 |
CD_APPDIR | 実行ファイルのあるディレクトリーをカレントディレクトリーとして設定します。これにより、 Java システムプロパティー user.dir は実行ファイルのあるディレクトリーパスで初期化されます。-s オプションを指定して作成したプログラムをサービスとして実行した場合は、 この拡張フラグの有無に関わらず常に実行ファイルのあるディレクトリーがカレントディレクトリーとして設定されます。 |
CLIENTVM | Client VM を優先して使用します。Client VM は、 特にアプリケーションの起動時間を短縮し、 メモリ消費を少なくするように作られており、 クライアント環境に適合します。ウィンドウ ・ アプリケーションとコンソール ・ アプリケーションは既定で Client VM を使用するように構成されます。Windows サービス ・ アプリケーションで Client VM を使用する場合に、 この拡張フラグを指定してください。Client VM を使用するように構成されていても、 実行時に Client VM が見つからない場合は、 自動的に Server VM を使用します。 |
SERVERVM | Server VM を優先して使用します。Server VM は、 操作の最高速度を高めるようにチューニングされており、 長時間稼働するサーバーアプリケーションの実行用に設計されています。Windows サービス ・ アプリケーションでは既定で Server VM を使用するように構成されます。ウィンドウ ・ アプリケーション、 コンソール ・ アプリケーションで Server VM を使用する場合に、 この拡張フラグを指定してください。Server VM を使用するように構成されていても、 実行時に Server VM が見つからない場合は、 自動的に Client VM を使用します。 |
サービス構成オプション(インストール時)
インストール時のサービス構成オプションは、 Windows サービスをインストールするときに指定することができます。インストール時のサービス構成オプションは -install
よりも前に指定する必要があります。-install
よりも後に指定した引数は、 サービスの実行時引数として渡されます。
スタートアップの種類を 手動
にしてサービスをインストールする場合は以下のようにします。
コマンドプロンプトC:¥>ServiceSample1.exe -m -install
サービス構成オプション | 説明 |
---|---|
-help | サービス構成オプションに関するヘルプメッセージを表示します。拡張フラグ NOHELP を指定してサービス ・ アプリケーションが作成されている場合、 このオプションは無効です。 |
-install | サービスとしてインストールします。他の構成オプションは、 必ず -install よりも前に指定してください。この操作には管理者権限が必要です。管理者権限で実行されていない場合、 ユーザー アカウント制御 (UAC) ダイアログが表示され、 権限昇格が要求されます。 |
-n <display-name> | サービスの表示名を指定します。 |
-i | デスクトップとの対話をサービスに許可します。 |
-m | スタートアップの種類を 手動 にします。このオプションを指定しない場合、 スタートアップの種類は 自動 になります。 |
-d <dependencies> | サービスの依存関係を指定します。たとえばサービスがイベントログサービスを必要としている場合は、 -d Eventlog としてイベントログサービスに依存させます。複数のサービスに依存する場合は、 サービス名をセミコロン ; で区切ります。 |
-u <username> | サービスの実行アカウントを指定します。通常のユーザーアカウントのほかにビルトイン ・ システムアカウントとして、 NT AUTHORITY\System 、 NT AUTHORITY\LocalService 、 NT AUTHORITY\NetworkService が指定できます。 |
-p <password> | サービス実行アカウントのパスワードを指定します。ビルトイン ・ システムアカウントを使用する場合は、 パスワードを指定する必要はありません。 |
-s | サービスをインストールした後に、 ただちにサービスを開始します。 |
サービス構成オプション(アンインストール時)
アンインストール時のサービス構成オプションは、 Windows サービスをアンインストールするときに指定することができます。アンインストール時のサービス構成オプションは -remove
よりも前に指定する必要があります。
サービスを停止してからアンインストールする場合は以下のようにします。
コマンドプロンプトC:¥>ServiceSample1.exe -s -remove
サービス構成オプション | 説明 |
---|---|
-help | サービス構成オプションに関するヘルプメッセージを表示します。拡張フラグ NOHELP を指定してサービス ・ アプリケーションが作成されている場合、 このオプションは無効です。 |
-remove | サービスをアンインストールします。他の構成オプション -s は、 必ず -remove よりも前に指定してください。この操作には管理者権限が必要です。管理者権限で実行されていない場合、 ユーザー アカウント制御 (UAC) ダイアログが表示され、 権限昇格が要求されます。 |
-s | サービスをアンインストールする前に、 サービスを停止します。 |