为什么我的环境变量被错误地处理为JVM选项?

时间:2016-01-29 08:59:06

标签: java bash environment-variables jvm-arguments

我想在执行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命令忽略了“回声测试”周围的引号。

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

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

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

关于JVM选项的

An article from Oracle,提到使用分号:

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

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

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

1 个答案:

答案 0 :(得分:2)

运行java时,应引用$OOM

示例:

java "$OOM" -jar foo.jar

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