Why does 'java -version' go to stderr?
java, stderr, stdout
Solution
Is there any special reason for the results of java -version going to stderr?
AFAIK, there is no special reason. It is just how the `java` command was / is implemented. Probably all the way back to Java 1.0, though it would be very difficult to verify that.
My brief investigation shows that this behavior is inconsistent with how most Linux commands behave ... everything else I've tried uses stdout for version information. (After all, the version information is not "error" output.)
Note however `--version` / `-version` options are a convention rather than something required by any formal standard. (The GNU coding standards state that commands should implement `--version` and that version info should be written to standard output. But POSIX standards don't mention this, nor do the LSB standards.)
What can / should you do?
- It should be easy to capture stderr instead of stdout in your shell script or batch file.
- There shouldn't be any risk in doing this. Oracle cannot change the Java tool chains to send `-version` output to stdout without potentially breaking customer scripts. This is highly unlikely1.
1 - Here is evidence of just how unlikely it is: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4380614. Note the "Resolution: Wont Fix" ... and the final comment.
UPDATE
In Java 9, they introduced some new "version" command line options. If you run `java -help 2>&1 | grep version` against a Java 11 installation you will see the following:
$ java -help 2>&1 | grep version
-version print product version to the error stream and exit
--version print product version to the output stream and exit
-showversion print product version to the error stream and continue
--show-version
print product version to the output stream and continue.
So if you are using Java 11 LTS or later, the solution will be to use `--version` rather that `-version` to get the version information.
Problem
Is there any special reason for the results of `java -version` going to `stderr`? For example, this command executed from Windows' prompt line: ``` java -version > java_version.txt ``` leaves the file `java_version.txt` empty. EDIT: The same happens with the help printed out after executing `java.exe` without any parameters. EDIT: Just out of a sheer curiosity I checked whether it has been always like that and it turned out it actually has. `java -version` goes to `stderr` in JDK 1.1.8 and also in JDK 1.2.2, however the outputs of `java.exe` without any parameters do not.