Подавление сообщения "Picked _JAVA_OPTIONS"

Я использую _JAVA_OPTIONS, чтобы установить некоторые значения по умолчанию для Java на RHEL. Это работает нормально, но теперь каждый раз, когда я запускаю Java, я получаю следующее сообщение

 Picked up _JAVA_OPTIONS: -foo -bar -baz

Можно ли сохранить параметры, но подавить отображение этого сообщения.

3 ответа

Java часто вызывается с абсолютными путями, такими как /usr/bin/java, что делает этот ответ бесполезным в некоторых случаях и требует большего, чтобы заставить его работать в других.

Это решение, которое я нашел, требует написания сценария оболочки-оболочки, который перенаправляет STDERR через фильтр, удаляющий ошибочную строку. Это должно быть помещено в $PATH перед двоичным Java-кодом он оборачивается и вызывается с простым java, which java или аналогичный (или ваш инструмент должен быть настроен для его использования)

Он опирается на способность bash создать подоболочку с круглыми скобками (command)и перенаправить Java STDERR на его STDIN command1 2> >(command2), Наконец, процесс в подоболочке должен снова перенаправить свой отфильтрованный ввод в STDOUT, чтобы Java-программы все еще могли использовать STDERR.

#!/bin/bash
/usr/bin/java "$@" 2> >(grep -v "^Picked up _JAVA_OPTIONS:" >&2)

Или вы можете поместить это в ваши файлы запуска / профиля оболочки:

_SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS"
unset _JAVA_OPTIONS
alias java='java "$_SILENT_JAVA_OPTIONS"'

Это сообщение выводится всеми стандартными версиями Java, начиная с (думаю, Java 5). Он наверняка присутствует в исходном коде версий Java 6–15.

Он выводится командой, когда она видит, что или_JAVA_OPTIONSпеременная среды установлена ​​и когда пользователь не имеет привилегий. Это поведение запрограммировано, и команда не позволяет его подавить. (Если вам нужны более точные подробности, посмотритеarguments.cppфайл.)

Люди просили Oracle добавить опцию для подавления сообщения:

JDK-8039152: нужен способ скрыть сообщение при выборе JAVA_TOOL_OPTIONS.

но это было закрыто как НЕ ИСПРАВЛЕНО.


Прежде всего важно понять, почему выводится это сообщение. Согласно анализу отчета об ошибках:

«Так что остается добавить возможность подавления сообщения. Да, мы могли бы это сделать, но хорошая ли это идея? Причина, по которой выдается сообщение, заключается в том, что используемая функция опасна, и виртуальная машина должна предупредить об этом.

Я настоятельно рекомендую нам не пытаться изменить такое поведение. 04.03.2014"

Короче говоря, это сообщение является ПРЕДУПРЕЖДЕНИЕМ о том, что может произойти что-то потенциально опасное. Что-то, что может привести к неожиданному (и, возможно, даже небезопасному) поведению.


Так что же можно сделать, чтобы раздражающее сообщение исчезло?

Лучшее решение — не использовать эти переменные. Отключите их! Существуют и другие способы передачи командных параметров команде, менее опасные. Если раздражающий вывод поступает из какого-либо приложения, которое использует эти переменные... создайте отчет об ошибке для приложения.

Есть и другие возможные решения; например, фильтрация сообщения из потока ошибок или расширениеJAVA_TOOL_OPTIONSв командную строку (см. другие ответы).

  • Я рекомендую вам НЕ делать ни того, ни другого. Почему? Потому что, подавляя сообщение, вы отключаете важную функцию безопасности в команде.

  • И если вы все же решите подавить сообщение, НЕ делайте этого, заменяя стандартноеjavaкоманда с псевдонимом оболочки или скриптом-оболочкой. Это действительно напрашивается на неприятности.

Другие вопросы по тегам