Spring 引导可执行文件 JAVA_OPTS 用空格覆盖

Spring Boot executable JAVA_OPTS override with spaces

我正在使用 Spring Boot 1.4.1 创建一个可执行的 Unix JAR 文件(根据说明 here)。我正在使用自定义 .conf 文件在 运行 时设置 JAVA_OPTS 值。这在以下内容下运行良好:

JAVA_OPTS="-Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"

我现在想覆盖我在 application.yml 文件(嵌入在 JAR 中)中配置的参数。问题是这个参数的值里面有空格。

我试过:

JAVA_OPTS="-Dmy.param=One Two -Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"

...和...

JAVA_OPTS="-Dmy.param=One\ Two -Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"

...和...

JAVA_OPTS=-Dmy.param=One\ Two -Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit

...和...

JAVA_OPTS=""-Dmy.param=One\ Two" -Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"

但我收到各种错误消息,例如:

Error: Could not find or load main class Two

...或...

/var/myapp/myapp.conf line 1: Two: command not found

我查看了嵌入在 JAR 文件顶部的代码,它似乎是:

arguments=(-Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar $jarfile $RUN_ARGS "$@")

...但我无法弄清楚如何将其转换为有效的 JAVA_OPTS 值

我最终做的是根据说明 here 使用外部化 application.yml。仍然不是我想要的,但现在可以了。

有同样的问题,发现用反斜杠转义嵌入的双引号可以解决问题,如下所示:

JAVA_OPTS="-Dmy.param=\"One Two\" -Dspring.profiles.active=prod -Dflyway.validate-on-migrate=false -Djavax.net.ssl.trustStore=/var/myapp/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"