Javaのエラーをファイルにリダイレクトする

JavaをWindowsのコマンドプロンプト等で実行していた場合に、エラーが出力されることがあります。

エラー内容を見ようとして、

java -classpath libaxis.jar;libwsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java -a sand_enterprise.wsdl -o src > log.txt

のように単純にリダイレクトしても、何も出力されていない。。ということありますよね。

Javaには標準出力と標準エラー出力があり、標準エラー出力の方がリダイレクトされていないためです。

標準エラー出力もログファイル等にリダイレクトするには、以下のようにします。

java -classpath libaxis.jar;libwsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java -a sand_enterprise.wsdl -o src > log.txt 2>&1

これでめでたくファイルにエラーが出力されるのですが、「2>&1」ってどういう意味なんだっけ?という人のために、解説。

マイクロソフトのHPに「コマンド リダイレクト演算子を使用する」というページがあります。

ここの記述によると、1とか2はハンドル番号で、

ハンドルハンドル番号説明
STDIN0キーボード入力
STDOUT1コマンド プロンプト ウィンドウへの出力
STDERR2コマンド プロンプト ウィンドウへのエラーの出力
UNDEFINED3-9ハンドルはアプリケーションによって個別に定義され、各ツールで固有です

となっています。

また、>や&に関しては、

記号説明
>コマンド プロンプト ウィンドウやハンドルの代わりに、ファイルまたはデバイス (プリンタなど) にコマンドの出力を書き込みます。
<コマンドの入力を、キーボードやハンドルからの入力の代わりに、ファイルから読み取ります。
>>既にファイルにある情報を削除しないで、ファイルの最後にコマンドの出力を追加します。
>&あるハンドルからの出力を別のハンドルの入力に書き込みます。
<&あるハンドルからの入力を読み取り、別のハンドルの出力に書き込みます。
|あるコマンドからの出力を読み取り、別のコマンドの入力に書き込みます。パイプとも呼ばれます。

ですから、STDERRを、STDOUTの入力に書き込むことになりますね。