torutkのブログ

ソフトウェア・エンジニアのブログ

Windows 7でCygwin上で作成したディレクトリがCygwin以外で実在しない(VirtualStore)

Windows Vista以降で発生する現象ですが、Vistaで問題に直面したことはなく、Windows 7で今日初めて問題に直面しました。

Cygwinbash上で、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\... のような場所に書き込まれるという仕組みだそうです。

めぼしい解説ページをいくつか列挙します。

これは、Program Files下にインストールしたアプリケーションのiniファイルにユーザー固有情報を書き込む際、他のユーザに影響が及ばないようにCopy on Write的な仕組みでユーザ固有の場所に書き込む目的で設けられたとあります。
これは、書き込んだアプリにだけ見えるようなので、Cygwinで作った場合はCygwin上でしか見えないようです。

とりあえず、VirtualStore下にできたディレクトリをエクスプローラでProgram Files以下に移動させて対処しましたが、ちょっとやっかいな仕組みです。