機能

外部ライブラリの読み込み

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 を検索します。

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 オプションにはどのようなものがありますか?

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 を参照してください。

Pack200 アーカイブ形式

exewrap JAR ファイル形式に特化し高い圧縮率を実現する Pack200 アーカイブ形式に対応しています。Pack200 アーカイブ形式を使用すると JAR ファイルのサイズを半分程度のサイズに圧縮することができます。Pack200 アーカイブ形式は Java 実行環境 5.0(1.5.0) 以上で利用できます。

exewrap -t オプションで 1.5 以上を指定することで 自動的に Pack200 アーカイブ形式が使用されます。-t オプションを省略した場合もターゲットバージョン 1.5 として扱われるため Pack200 アーカイブ形式が使用されます。

システム プロパティ

exewrap で作成したアプリケーションは実行時に いくつかのシステムプロパティを自動的に設定します。

システム プロパティ説明
java.application.pathアプリケーションファイルのパスを保持しています。
java.application.nameアプリケーションファイルの名前を保持しています。
java.application.versionアプリケーションのバージョンを保持しています。
java.application.startupアプリケーション プロセスの開始時間を保持しています。

たとえば アプリケーションの完全なパスを取得するために次のコードが使用できます。

System.getProperty("java.application.path") + "¥¥" + System.getProperty("java.application.name")

環境変数を設定する

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 化していない場合は環境変数が設定されないことになります