【问题标题】:Why is my environment variable incorrectly processed as a JVM option?为什么我的环境变量被错误地处理为 JVM 选项?
【发布时间】:2016-05-06 22:45:54
【问题描述】:

我想在执行java -jar时使用环境变量作为JVM选项。

我要执行的命令:

java -XX:onOutOfMemory='echo test' -jar foo.jar

当我按原样运行上述命令时,jar 将运行。

(如果您没有 foo.jar,您将收到 Error: Unable to access jarfile foo.jar 错误。但这仍然意味着该选项被正确使用)。

但是当我创建一个包含 JVM 选项的环境变量,并使用该变量运行命令时。

OOM="-XX:onOutOfMemory='echo test'"
java $OOM -jar foo.jar

然后我得到以下错误:

Error: Could not find or load main class test'

java 命令似乎忽略了“echo test”周围的引号。

在寻找类似的问题on SOon other websites 之后,我尝试了使用引号的各种变体:

OOM="-XX:OnOutOfMemoryError=\"echo test\""
OOM='-XX:OnOutOfMemoryError="echo test"'
OOM=-XX:OnOutOfMemoryError="echo test"

但它们都会导致相同的错误。

An article from Oracle 涉及 JVM 选项,使用分号提及:

-XX:OnOutOfMemoryError="<cmd args>; <cmd args>"

但是分号的目的是分隔多个命令,而不是命令和参数。所以这并不能解决我的问题。

有人知道如何正确地将-XX:onOutOfMemory='echo test' 选项移动到环境变量中吗?

【问题讨论】:

  • “回声测试”并没有真正的目的。我以它为例。我要执行的实际命令是:'kill -9 %p'。

标签: java bash environment-variables jvm-arguments


【解决方案1】:

运行java时,应引用$OOM

例子:

java "$OOM" -jar foo.jar

请参阅 Unix stackexchange 上的 Why does my shell script choke on whitespace or other special characters? 了解为什么需要这样做。

【讨论】:

  • 我不敢相信它这么简单!引用变量就可以了。我也看一下你引用的答案,里面似乎包含了很多有用的信息。
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多