我正在使用 _JAVA_OPTIONS 在 RHEL 上设置 Java 的一些默认值。它工作正常,但现在每次启动 Java 时都会收到以下消息
Picked up _JAVA_OPTIONS: -foo -bar -baz
是否可以保留选项但不显示该消息。
答案1
Java 通常使用绝对路径来调用/usr/bin/java
,例如,这使得该答案在某些情况下毫无用处,而在其他情况下则需要更多才能使其起作用。
我发现的解决方案需要编写一个包装器 shell 脚本,该脚本通过过滤器重定向 STDERR,删除有问题的行。它必须放在它包装的 java 二进制文件之前,并使用普通的或类似$PATH
命令调用(或者必须配置您的工具才能使用它)java
which 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_OPTIONS
到java
命令行(参见其他答案)。
我建议你不要执行上述任一操作。为什么?因为通过隐藏消息,您将禁用
java
命令中的一个重要安全功能。如果你决定隐藏这条消息,不要通过使用 shell 别名或包装器脚本替换标准
java
命令来实现这一点。这真的是自找麻烦。