UACの落とし穴
先日ちらと書いたネタの続き.
結論からいうと,Eclipse系(少なくとも3.2以前)のアプリは,Program Files にいれるには困難が伴う.
きっと当たり前すぎてblogに書く人がいないのだろうと思いながら検索をかけると,
なんていう乱暴な話も結構ある.UACをオフにしていて気づいていない開発者もいるような気もする.
「Vistaでプログラミングをするには管理者権限が必須」と考えておきましょう。
そこで,軽く整理しておく.
UAC (User Access Control)というのは,いろいろな機構の集合体を指すらしい.Eclipseで致命的に問題になるのは,仮想リダイレクト機構と呼ばれるもの.
詳しくは,ぐーぐる先生に解説してもらったほうが手っ取り早いが,端的に言うと,アプリケーションやライブラリのあるようなディレクトリに,管理者権限がないユーザが書き込みを行えなくする仕組み.Unicesでの/usr/bin のように単にエラーを返すのではなく,ユーザのホーム(の中にある隠しフォルダ)にリダイレクトして書き込む.
まあ,この機構のアイデア自身は,別段悪いものではない.書き込むときにリダイレクトしたのと同様に,読み込むときにもリダイレクトしてくれれば.
しかし,このささやかな願いは叶えられない.
SWTのDLLが消えるワケ
Eclipseは(というか,そのリソース管理をしているOSGiは),jarの中に入っているリソースをローカルのファイルシステムに暗黙的に展開し,善きにはからう機構がある.SWTはネイティブライブラリなのに,DLLへのパスを与えなくてもなんとなく動いてしまうのは,この仕組みのおかげ.
何もしなければ,通常は,eclipse/configuration というディレクトリの下にこれらのリソースは展開される.仮にEclipseがc:\Program Files の下にあるならば, c:\Program Files\eclipse\configuration だ.
ここで UAC が絡んでくる.UACは,展開した DLL を,既述の通りリダイレクトする.しかし,eclipse はリダイレクトされたDLLを見つけることができない(なんてことだ!).結果として,eclipseはSWTをロードできずに落ちる.
java.lang.UnsatisfiedLinkError: no swt-win32-3232 in java.library.path.
The SWT FAQが示唆するとおり,jarからDLLを引きずり出せばとりあえずこのエラーはでなくなる.ARMのRVDSはこの方法を推奨しているようだが,焼け石に水.jarの後ろにバイナリリソースを隠しているのはSWTだけとは限らない.
この酷い状況を回避するには,4つの方法がある.
- eclipse/configuration の場所を,リダイレクションが起きない位置に,明示的に指定する.
- Eclipse を c:\Program Filesなど,UACのリダイレクションが起きるような場所に置かない.
- 管理者権限で実行する.
- UACを無効にする.
個人のPCであれば好き勝手できるはずであるが,システム管理者のいる職場ではできることは限られるだろう.
Eclipse/RCP をベースとするソフトウェアを(有償/無償を問わず)配布している場合は,慎重に方針を決める必要がある.
Update Manager をどうするか.
ちなみに,configuration 以外にも UACの影響を受ける可能性のある処理がある.Update Manager を使ったアップデートだ.
プラグインと,その集合を定義するフィーチャーはいずれも,eclipse/plugins および eclipse/features に存在する.configurations は一時ファイルなのでユーザごとにあっても構わないだろうが,プラグインやフィーチャーは,そうはいかないだろう.
回避策として,
- アップデートのみ管理者権限で実行する
ということが考えられる.この回避策は割と理に適っているような気がする.
もちろん,上記の
ということも回避策としては考えられる.
Mayinstallなど,Update Managerをリプレースしてくれそうなプロジェクトも進行中で,いつの日か上手いことやってくれるかもしれないが,しばらくの間は悩ましい日々が続くことになるだろう.