本カスタムヘッドでは、Launch4jの標準のjava起動部に対して、以下のような機能を追加するものである。
- JREの探索順序を拡張する
- *.cfgファイルのSETTINGSセクションにあるJAVA_HOMEキー
- バンドルJRE
- レジストリによるJRE/JDK探索
- いずれも見つからなかった場合は、フォルダ選択ダイアログを表示しユーザーにJAVA_HOMEを選択してもらう
- ユーザーの選択したJAVA_HOMEはjava.exe, javaw.exeの実在の確認と、x64, x86の条件がマッチするかまでは確認する。
- ただし、(現時点では)javaのバージョンが妥当であるかは確認しない。
- 選択されたJAVA_HOMEでjavaがエラーなく起動できた場合は、*.cfgファイルのSETTINGSセクションのJAVA_HOMEに記録される。
- *.cfgファイルがなければ作成される。(作成できない場合はエラーにせず、単に無視する。)
- ユーザーの選択したJAVA_HOMEはjava.exe, javaw.exeの実在の確認と、x64, x86の条件がマッチするかまでは確認する。
- Launch4jの設定でビルド時に指定する固定のコマンドラインも変数展開する
- ユーザーが起動時に指定する引数は(従来どおり)変数展開されない。
- *.l4j.iniファイルがみつからない場合は、*.iniファイルを使う。
- *.cfgファイルのENVIRONMENTSセクションにあるキーと値で実行時に環境変数が設定される。
- ビルド時に指定した固定の環境変数が設定されたあと、*.cfgファイルの環境変数が設定される。
- 環境変数の設定はJVMオプションの設定より先に行われるので、JVMオプションで環境変数展開につかえる。
- *.cfgファイルのJVM_OPTIONSセクションにある値でJVMパラメータを指定できる。
- iniファイルの形式はKEY=VALUE形式でなければならないので、KEYはなんでも良いので適当につけておく。
- ビルド時に指定した固定のJVMオプションが設定されたあと、*.cfgのJVMオプションが設定され、最後に*.l4j.ini(または*.ini)が設定される。
- 以下の特殊変数をサポートする。(太字のものが追加されたもの。それ以外は標準のものである)
- FIND_ANCESTOR EXEDIRから親に向かって特定の名前にマッチするファイルまたはフォルダを検索する
- JRE_ARCH 実行するJAVAのx86, x64のタイプを示す
- EXEDIR 実行ファイルのあるディレクトリ
- EXEFILE 実行ファイルのパス
- PWD 設定された現在ディレクトリ
- OLDPWD 起動時のカレントディレクトリ
- JREHOMEDIR JREのホームディレクトリ
- HKEYで始まるレジストリキー名 レジストリの値
- それ以外は普通の環境変数を展開する
cfgファイルは、exeの拡張子をcfgに変えたファイル名をもつテキストファイルであり、INIファイルと同じフォーマットである。
このファイルはなくてもかまわない。
セクション | キー | 内容 |
---|---|---|
SETTINGS | JAVA_HOME | 起動に使うJAVA_HOMEを指定する |
SAVEJAVAHOME | 1が既定。0でJAVA_HOMEを保存しない | |
ENVIRONMENTS | 任意の環境変数 | 任意の環境変数の値 |
JVM_OPTIONS | 適当な名前 | JVMオプション |
FIND_ANCESTOR
は、指定した名前をもつファイルまたはディレクトリをEXEDIR
からルートに向かって探索し、
みつかったフルパスを返すものである。
みつからない場合は空となる。
探索するファイル名はコロンの後で指定し、フォルダ区切りを含めて良い。
%FIND_ANCESTOR:探索するファイル名%
のように指定する。
フォルダ区切りを含めて良いので、
ABC_HOME=%FIND_ANCESTOR:A\B\C%
のように指定することができる。
この場合、EXEDIRがQ:\R\Sという場所にあった場合、
- Q:\R\S\A\B\C
- Q:\R\A\B\C
- Q:\A\B\C
のように探索される。
また、検索対象は複数候補指定できる。
%FIND_ANCESTOR:検索名1;検索名2;検索名3...%
のように、複数候補をセミコロン区切り(;)で指定する。
この場合、検索名1で検索を行い、該当がない場合に検索名2、検索名3と試行する。
最初にみつかった時点で完了となる。
いずれもみつからない場合は空となる。
JRE_ARCH
は、実行するjava.exe(またはjavaw.exe)が32ビットまたは64ビットのどちらかであるかを表す。
%JRE_ARCH:i386,amd64%
のように32ビット, 64ビットとして表現する文字列を指定することができる。
この場合、32ビットの場合は「i386」、64ビットの場合は「amd64」という文字列が返される。
この文字列は省略することができ、
%JRE_ARCH%
とした場合は、「x86」「x64」のいずれかの文字列となる。
このカスタマイズされたヘッダを使用した実行可能jarをexeファイル化するサンプルは maven でビルドできる。
mvn package
これで、targetディレクトリ上に このヘッダを使ったLaunch4jで生成された実行ファイル launch4jhead.exe
が得られる。
なお、使用しているMavenプラグインは
<!-- https://mvnrepository.com/artifact/com.akathist.maven.plugins.launch4j/launch4j-maven-plugin -->
<dependency>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.25</version>
</dependency>
である。 (注意: プラグインのバージョンは1.7.25以降でないとカスタムヘッダがつかえない)
このサンプルプログラムは、Swingで記述されたGUIアプリであり、システムプロパティと環境変数の一覧を表示する。
(なお、一応、Java8, Java11のいずれで実行しても、HiDpi対応しており、スクリーンスケールにあわせて画面サイズを設定するようになっている。)
本カスタムヘッダの元となるソースは、Launch4jのver3.12である。
Launch4j 3.12では、MinGWのbinutils 2.22を使用しており、このバージョンから、おそらく、gccは32ビット版の4.6.2あたりを使っていると思われる。
そのため、これに近いバージョンのコンパイル用として、Dev-C++ 5.0.0.9 を使用している。
(完全には一致していないので、*.o, *.a は、Dev-C++ 5.0.0.9 でビルドに使ったものに置き換える必要がある。)
プロジェクトファイルは src/Launch4jStub/head_src/guihead/guihead.dev
にあり、Dev-C++ で開くことができる。
(なお、head.c
ソースは、consolehead
のプロジェクトと共通である。)
END.