UACの落とし穴

先日ちらと書いたネタの続き.

結論からいうと,Eclipse系(少なくとも3.2以前)のアプリは,Program Files にいれるには困難が伴う.


きっと当たり前すぎてblogに書く人がいないのだろうと思いながら検索をかけると,


Vistaでプログラミングをするには管理者権限が必須」と考えておきましょう。
なんていう乱暴な話も結構ある.UACをオフにしていて気づいていない開発者もいるような気もする.

そこで,軽く整理しておく.


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を見つけることができない(なんてことだ!).結果として,eclipseSWTをロードできずに落ちる.

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 は一時ファイルなのでユーザごとにあっても構わないだろうが,プラグインやフィーチャーは,そうはいかないだろう.

回避策として,

  • アップデートのみ管理者権限で実行する

ということが考えられる.この回避策は割と理に適っているような気がする.

もちろん,上記の

  • Eclipse を c:\Program Filesなど,UACのリダイレクションが起きるような場所に置かない.
  • UACを無効にする.

ということも回避策としては考えられる.


Mayinstallなど,Update Managerをリプレースしてくれそうなプロジェクトも進行中で,いつの日か上手いことやってくれるかもしれないが,しばらくの間は悩ましい日々が続くことになるだろう.