jEditをWin32アプリケーションとして

このエントリは2007/3/14の再掲です。

補足
  • 再掲の時点で、launch4j 3.0.1がリリースされています。
  • 再掲の時点でリリースされている FileZilla 3.1 では、エディタが「このファイルは別のプログラムによって削除されました」と言わないように修正されています。
  • jEditコミュニティのトピック Creating EXE for file association - jEdit Community

JARとBATで簡単に起動できるjEditですが、あえてeclipse.exeのようにWin32実可能ファイルから起動してみたところ、Windows環境との親和性が高まりました。その背景と手法を紹介します。

フリーか商用かを問わず、「外部テキストエディタはEXE形式の実行可能ファイルだろう」と期待して作られているWindowsアプリケーションが数多くあります。そのようなアプリケーションでは、子プロセスと一時ファイルを使ったデータ交換を行ったり、便利なWin32APIを使ってプロセスを見張って一時ファイルの寿命を管理したり、子プロセスが終了するまで、親プロセスのシャットダウンを抑制したりします。

たとえば、FileZilla のサーバファイル直接閲覧では、外部テキストエディタに渡される一時ファイルが、エディタの起動に使われたプログラムのプロセス寿命と同時に削除されます。さてこのとき、テキストエディタがWin32ユーティリティにありがちな単純な実行イメージではなく、複数のプロセスで構成されているとどうなるでしょう?jEditのBATファイルは、個別プロセスとしてjava.exeを実行したあと、コマンドシェルプロセスを終了します。java.exeが一時ファイルにアクセスする頃には、BATの終了を検知したFileZillaがその一時ファイルを削除しています。

というわけで、 Win32アプリケーションから外部テキストエディタとして利用されるプログラムは、できるだけ、一般的なWin32ネイティブアプリケーションに似たプロセスであるべきだ、というのが結論です。なので、jEditをWin32実行可能ファイルでラップし、他のアプリケーションから見たとき、Win32ネイティブに見えるように細工して使うことにします。

JavaアプリケーションをWin32実行可能ファイルに見せかける方法にはさまざまなものがありますが、今回はlaunch4jのバージョン3プレリリース版を使うことにします。安定版のバージョン2は、ルック&フィールのせいでマルチバイト文字が化けてしまいます。

無料で手に入るもののうち、もっとも有名なのはJSmoothですが、JSmoothで生成された実行可能ファイルは、Windows形式のファイルパスを渡したときホワイトスペース等の文字をうまく処理できないので、今回の用途には適しません。 jEditをよりWindows環境になじませることが狙いなので、"C:\Documents and Settings\...\Local Settings"などが通らないと意味がありませんから。(ささいなことですが、JSmoothはICO拡張子のWindowsアイコンファイルが使えないので、マルチ解像度アイコンに対応できません)

launch4j-3.0.0-pre2以降をダウンロード

http://launch4j.sourceforge.net/index.html

launch4j-3形式のコンフィギュレーションファイル

ダウンロード jEditWin32Executable.launch4j.xml

このファイルをjEditインストールディレクトリ(jedit.jarとjedit.icoがある場所)に置き、launch4jで開いて、起動用EXE ファイルを作成します。作成できたjEdit.exeは、jedit.jarを実行するjava.exeが終了するまで、そのプロセスを終了させることはないように設定されています。jEdit.exeを利用するプロセスから見れば、ごく自然なWindowsのプログラムが動いているように見えるので、他のWidowsアプリケーションとの連携が改善されます。

ただし、WindowsらしくなったjEditといえど、一般的な(複数起動しない)MDIテキストエディタと同じ問題には遭遇します。jEditのメモリ消費は大きいので、複数起動を避けて起動するのが通例です。FileZilla からjEditで閲覧する場合に、すでにjEditが起動していると、起動プロセスは編集対象のデータを既存のプロセスに譲り、すぐに終了してしまいます。とはいえ、jEditは十分に早く一時ファイルを読み取るので、閲覧できないような致命的な問題は起こりません。閲覧中に「このファイルは別のプログラムによって削除されました」と言われるかもしれませんが。

FileZillaはあくまで、いろいろな状況を網羅するための一例で、じっさいのところ、WYSIWYGのHTMLオーサリングツールのコード確認や、Flashオーサリング時のスクリプト記述といった用途が多いのではないでしょうか?Internet Explorerのソースビュアーとしても使えるかもしれません。