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"
我正在使用 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"