torutkのブログ

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

'ant'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません

Apache Ant 1.8.1をWindows 7にインストールして、今更ながら題名のとおり悲しいエラーに出会ってしまいました・・・。
Cygwinのコマンドから実行できていたのですが、Windowsコマンドプロンプトから実行するとantが見つからないというエラーになりました。

インストールで実施したこと

ここで、apache-ant-1.8.1\binの下を見ると、次のファイルしかありません。

ant  antRun  antRun.pl  complete-ant-cmd.pl  runant.pl  runant.py

あれっ、Windows用のバッチファイル(ant.bat)がない!

調査

Cygwinのtarコマンドでapache-ant-1.8.1-bin.tar.bz2の内容一覧を見ると、確かにない*2

-rwxr-xr-x ant/ant        9997 2010-05-01 07:02 apache-ant-1.8.1/bin/ant
-rwxr-xr-x ant/ant         861 2010-05-01 07:02 apache-ant-1.8.1/bin/antRun
-rwxr-xr-x ant/ant        2199 2010-05-01 07:02 apache-ant-1.8.1/bin/antRun.pl
-rwxr-xr-x ant/ant        3219 2010-05-01 07:02 apache-ant-1.8.1/bin/complete-ant-cmd.pl
-rwxr-xr-x ant/ant        4422 2010-05-01 07:02 apache-ant-1.8.1/bin/runant.pl
-rwxr-xr-x ant/ant        3396 2010-05-01 07:02 apache-ant-1.8.1/bin/runant.py
drwxr-xr-x ant/ant           0 2010-05-01 07:03 apache-ant-1.8.1/
drwxr-xr-x ant/ant           0 2010-05-01 07:02 apache-ant-1.8.1/bin/
drwxr-xr-x ant/ant           0 2010-05-01 07:03 apache-ant-1.8.1/docs/

そこで、apache-ant-1.8.1-bin.zipをダウンロードして、Cygwinのzipコマンドで一覧を見ると、

        0  04-30-2010 18:03   apache-ant-1.8.1/
        0  04-30-2010 18:02   apache-ant-1.8.1/bin/
     9997  04-30-2010 18:02   apache-ant-1.8.1/bin/ant
      861  04-30-2010 18:02   apache-ant-1.8.1/bin/antRun
     2199  04-30-2010 18:02   apache-ant-1.8.1/bin/antRun.pl
     3219  04-30-2010 18:02   apache-ant-1.8.1/bin/complete-ant-cmd.pl
     4422  04-30-2010 18:02   apache-ant-1.8.1/bin/runant.pl
     3396  04-30-2010 18:02   apache-ant-1.8.1/bin/runant.py
        0  04-30-2010 18:03   apache-ant-1.8.1/docs/

あれっ、やはりない。おかしい。

次に、Cygwin上ではなく、7zipで解凍を試みてみると、解凍先にC:\Program Files\Javaを指定し実行すると、最後に「診断結果」ダイアログが表示され、メッセージに「can not open output file C:\Program Files\Java\apache-ant-1.8.1\bin\ant」のようなメッセージが1633行表示されました。(この診断メッセージにおいて、binディレクトリの下のファイル名は上述と一緒)
ファイルは展開されていないので、何らかの原因でエラーになっているようです。

7zipで、展開先をいったんユーザーのディレクトリにしてみると、正常に展開され、かつbinディレクトリの下には

ant      antenv.cmd  antRun.pl            lcp.bat     runrc.cmd
ant.bat  antRun      complete-ant-cmd.pl  runant.pl
ant.cmd  antRun.bat  envset.cmd           runant.py

と、Windows用バッチコマンドが含まれていました。

この展開したディレクトリをエクスプローラでC:\Program Files\Javaの下へ移動させると、無事antが実行できるようになりました。

ここで、もしかしてと、Cygwin上でカレントディレクトリをユーザーディレクトリ(ホーム)に移動し、そこで先ほどと同じアーカイブファイルの中身を見てみると、tar.bz2の方もzipの方もどちらもWindows用バッチコマンドが含まれています。

カレントディレクトリがC:\Program Filesかその下のディレクトリにあるとき、tarやzipで展開しようとすると、"VirtualStore"の仕組みだけでなく、cmd、batなどのWindows実行形式のファイルがなかったことにされてしまうという現象のようです。
さらに、実際にファイルをProgram Files下にコピーするのではなく、tarのtオプションやzipのlオプションでアーカイブ内の一覧を見るだけなのに、スキップされてしまうので、ちょっと厄介な問題です。

関連しそうな情報

この記事中の「ケース3:Program Filesフォルダ以下のアクセス権問題」

同じような問題の質問が挙がっています。ただ、現時点で的確な回答はついていません。

*1:このとき「tar: 前のエラーにより失敗ステータスで終了します」のメッセージが出ていたのだが見過ごしていた

*2:実は、カレントディレクトリがC:\Program Files\Javaでtarを実行していたのが原因だったのだが、そんなこと想定外でした