Почему "java -version" переходит в stderr?

Есть ли какая-либо особая причина для результатов java -version, идущих на stderr?

Например, эта команда выполняется из строки подсказки Windows:

java -version > java_version.txt

оставляет файл java_version.txt пустым.

EDIT: То же самое происходит с помощью справки, распечатанной после выполнения java.exe без каких-либо параметров.

EDIT: Просто из-за явного любопытства я проверил, было ли это всегда так, и оказалось, что это действительно так. java -version переходит в stderr в JDK 1.1.8, а также в JDK 1.2.2, однако выходы java.exe без каких-либо параметров не работают.

Ответ 1

Есть ли какая-либо особая причина для результатов java -version, идущих на stderr?

AFAIK, нет особой причины. Это как команда java была/реализована. Вероятно, все возвращается к Java 1.0, хотя было бы очень сложно это проверить.

Мое краткое исследование показывает, что это поведение несовместимо с тем, как ведут себя большинство команд Linux... все, что я пробовал, использует stdout для информации о версии. (В конце концов, информация о версии не является результатом "ошибки".)

Обратите внимание, однако --version/-version параметры - это соглашение, а не что-то, требуемое любым формальным стандартом. (стандарты кодирования GNU сообщают, что команды должны реализовывать --version, и эта информация о версии должна быть записана на стандартный вывод. Но стандарты POSIX не упомянуть об этом, а также стандарты LSB.)


Что вы можете/должны делать?

  • Сложно удалить stderr вместо stdout в вашей оболочке script или пакетном файле.
  • При этом не должно быть риска. Oracle не может изменить цепочки инструментов Java, чтобы отправить вывод -version на stdout без потенциально нарушающих клиентские скрипты. Это маловероятно 1.

1 - Это свидетельствует о том, насколько маловероятно: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4380614. Обратите внимание на "Разрешение: Wont Fix"... и заключительный комментарий.

Ответ 2

Обходной путь для этой проблемы:

java -version 2> java_version.txt