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はハンドル番号で、
ハンドル | ハンドル番号 | 説明 |
---|---|---|
STDIN | 0 | キーボード入力 |
STDOUT | 1 | コマンド プロンプト ウィンドウへの出力 |
STDERR | 2 | コマンド プロンプト ウィンドウへのエラーの出力 |
UNDEFINED | 3-9 | ハンドルはアプリケーションによって個別に定義され、各ツールで固有です |
となっています。
また、>や&に関しては、
記号 | 説明 |
---|---|
> | コマンド プロンプト ウィンドウやハンドルの代わりに、ファイルまたはデバイス (プリンタなど) にコマンドの出力を書き込みます。 |
< | コマンドの入力を、キーボードやハンドルからの入力の代わりに、ファイルから読み取ります。 |
>> | 既にファイルにある情報を削除しないで、ファイルの最後にコマンドの出力を追加します。 |
>& | あるハンドルからの出力を別のハンドルの入力に書き込みます。 |
<& | あるハンドルからの入力を読み取り、別のハンドルの出力に書き込みます。 |
| | あるコマンドからの出力を読み取り、別のコマンドの入力に書き込みます。パイプとも呼ばれます。 |
ですから、STDERRを、STDOUTの入力に書き込むことになりますね。