为什么’java -version’会转到stderr?

java -version的结果有没有特殊的原因进入stderr

例如,此命令从Windows的提示行执行:

 java -version > java_version.txt 

将文件java_version.txt留空。

编辑:执行没有任何参数的java.exe后打印出来的帮助也是如此。

编辑:出于纯粹的好奇心,我检查了它是否总是那样,事实certificate它确实存在。 java -version在JDK 1.1.8和JDK 1.2.2中都转到stderr ,但java.exe的输出没有任何参数。

java -version的结果有没有特殊的原因进入stderr?

AFAIK,没有特殊原因。 这就是java命令的实现方式。 可能一直回到Java 1.0,虽然要validation它是非常困难的。

我的简短调查表明,这种行为与大多数Linux命令的行为方式不一致 ……我尝试过的其他一切都使用stdout来获取版本信息。 (毕竟,版本信息不是“错误”输出。)

但请注意--version / -version选项是一种约定,而不是任何正式标准所要求的。 ( GNU编码标准声明命令应该实现--version并且版本信息应该写入标准输出。但POSIX标准没有提到这一点,LSB标准也没有。)


你能做什么/应该做什么?

  • 在shell脚本或批处理文件中捕获stderr而不是stdout应该很容易。
  • 这样做应该没有任何风险。 Oracle无法更改Java工具链以将-version输出发送到stdout,而不会破坏客户脚本。 这极不可能1

1 – 以下证据表明它不太可能: http : //bugs.sun.com/bugdatabase/view_bug.do?video_id = 4380614 。 请注意“决议:不修复”……以及最终评论。

此问题的解决方法是:

 java -version 2> java_version.txt