launch4j (2)

Executable JARから実行ファイル作ってふんふ〜ん♪と試験してたら、外だししてるpropertiesファイルの読み込みがうまくいってないことが判明。JARの中(つまりEXEの中)に埋め込んであるリソースは大丈夫なのに。おかしいなあ、カレントディレクトリもEXEのある場所になってんぞ〜と、よく考えたらプロパティ読み込みは、内部で ClassLoader#getResourceAsStream 使ってっから、classpathが基準だったっけか。はてさて、System.getProperty("java.class.path") の値を取得してみたら、特に指定した覚えの無いEXEそのものは勝手に指定されていたけれど、カレントディレクトリは指定されていなかった。おぉぅ。なんとありがちなmiss。もしかしてNoClassDefFoundErrorと表示されて動きません並にハズかしい事なんじゃ。とりあえず、JRE起動オプションにて、下記のようにして classpath を明示してみる。

 -classpath . BootstrapClass

すると、今度はEXEがclasspathに含まれなくなったため、EXEに埋め込んだリソースにアクセスできなくなる。ぐわわ。なんだEXEは勝手に指定されるんじゃないのか。両方指定してやるにはどうすればいいんだ? EXEフルパスそのまま書くのあほくせーですよ? あーでもないこーでもないと、いろいろこねくり回した挙句、とりあえず下記のようにしてやればOKであることがわかった。やれやれ。

 -classpath .;"%EXEFILE%" BootstrapClass

念のため一応。これは JREタブのJVM Arguments項目の設定。カレント指定はもしかしたら "." じゃなくて "%EXEDIR%" の方がいいかもしれない。
さて、あとはいちいちGUI立ち上げるのUZEEEEので、Antから使えるようにしようと試みているのだけれど、現状classPassがネストがなんとかとか、よくわからんエラーがでてうまくいってないので、また今度。