禁止显示“Picked up _JAVA_OPTIONS”消息

禁止显示“Picked up _JAVA_OPTIONS”消息

我正在使用 _JAVA_OPTIONS 在 RHEL 上设置 Java 的一些默认值。它工作正常,但现在每次启动 Java 时都会收到以下消息

 Picked up _JAVA_OPTIONS: -foo -bar -baz

是否可以保留选项但不显示该消息。

答案1

Java 通常使用绝对路径来调用/usr/bin/java,例如,这使得该答案在某些情况下毫无用处,而在其他情况下则需要更多才能使其起作用。

我发现的解决方案需要编写一个包装器 shell 脚本,该脚本通过过滤器重定向 STDERR,删除有问题的行。它必须放在它包装的 java 二进制文件之前,并使用普通的或类似$PATH命令调用(或者必须配置您的工具才能使用它)javawhich java

它依赖于 bash 用括号创建子 shell 的能力(command),并将 java 的 STDERR 重定向到它的 STDIN command1 2> >(command2)。最后,子 shell 中的进程需要将其过滤后的输入再次重定向到 STDOUT ,以便 java 程序仍然可以使用 STDERR。

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

答案2

或者你可以将其放入你的 shell 启动/配置文件中:

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

答案3

自 Java 5 以来,所有标准版本的 Java 都会输出此消息。从 Java 6 到 Java 15 的源代码中肯定存在此消息。

java当命令发现JAVA_TOOL_OPTIONS_JAVA_OPTIONS环境变量已设置且用户没有特权时,它会输出该信息。该行为是硬编码的,java命令不提供抑制该行为的方法。(如果您需要更精确的详细信息,请查看文件arguments.cpp。)

人们要求 Oracle 添加一个选项来隐藏该消息:

JDK-8039152:需要一种方法来在拾取 JAVA_TOOL_OPTIONS 时抑制消息

但由于无法修复,该问题已被关闭。


首先,了解为什么会输出这个消息很重要。根据错误报告的分析:

“因此,就剩下添加一个选项来隐藏该消息了。是的,我们可以这样做,但这是一个好主意吗?发出该消息的原因是正在使用的功能很危险,VM 应该对此发出警告。

我强烈建议我们不要试图改变这种行为。2014 年 3 月 4 日”

简而言之,该消息是一种警告,表示可能会发生一些潜在的危险。某些事情可能会导致java以意想不到的方式(甚至可能是不安全的)行事。


那么你可以做些什么来让这些烦人的消息消失呢?

最好的解决方案是不使用这些变量。取消设置它们!还有其他方法可以将命令选项传递给java不太危险的方法可以将命令选项传递给命令。如果烦人的输出来自依赖这些变量的某个应用程序...请为该应用程序提交错误报告。

还有其他可能的解决方案;例如,从错误流中过滤出消息,或扩展JAVA_TOOL_OPTIONSjava命令行(参见其他答案)。

  • 我建议你不要执行上述任一操作。为什么?因为通过隐藏消息,您将禁用java命令中的一个重要安全功能。

  • 如果你决定隐藏这条消息,不要通过使用 shell 别名或包装器脚本替换标准java命令来实现这一点。这真的是自找麻烦。

相关内容