Windows Vista以降で発生する現象ですが、Vistaで問題に直面したことはなく、Windows 7で今日初めて問題に直面しました。
Cygwinのbash上で、C:\Program Files\Javaディレクトリ下にantのディレクトリを作成しました(tarで展開)。しかし、なぜかantの実行でエラーとなってしまいます。
~$ cd /cygdrive/c/Program\ Files/Java Java$ tar xjf ~/apache-ant-1.8.1-bin.tar.bz2 : Java$ ls apache-ant-1.8.1 Java$
ここまでは問題なさそうですが、
~$ ant java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.launch.Launcher at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: org.apache.tools.ant.launch.Launcher. Program will exit. Exception in thread "main"
とエラーになりました。で、エクスプローラでC:\Program Files\Javaを見ると、なんとapache-ant-1.8.1ディレクトリが存在しません。あれっ、Cygwin上では存在しています。
いろいろ調べると、これはWindows Vista以降でVirtualStoreと呼ばれる仕組みで、Program FilesやProgramData、Windowsといったシステムディレクトリにユーザーがファイルを書き込むと、実体はユーザーディレクトリのAppData\Local\VirtualStore\Program Files\... のような場所に書き込まれるという仕組みだそうです。
めぼしい解説ページをいくつか列挙します。
- http://pasofaq.jp/windows/vista/virtualstore.htm
- http://www.atmarkit.co.jp/fwin2k/vista_feature/08uac02/08uac02_02.html
これは、Program Files下にインストールしたアプリケーションのiniファイルにユーザー固有情報を書き込む際、他のユーザに影響が及ばないようにCopy on Write的な仕組みでユーザ固有の場所に書き込む目的で設けられたとあります。
これは、書き込んだアプリにだけ見えるようなので、Cygwinで作った場合はCygwin上でしか見えないようです。
とりあえず、VirtualStore下にできたディレクトリをエクスプローラでProgram Files以下に移動させて対処しましたが、ちょっとやっかいな仕組みです。