通过JAVA_选项将包含空格的系统属性传递给Tomcat

通过JAVA_选项将包含空格的系统属性传递给Tomcat,java,bash,shell,tomcat,tomcat6,Java,Bash,Shell,Tomcat,Tomcat6,我需要通过JAVA_OPTS环境变量将多个系统属性传递给Tomcat 6。我似乎无法传递包含空格的系统属性: JRE_HOME=/root/jre1.6.0_34/ JAVA_OPTS="-DsysProp1=foo -DsysProp2=bar with spaces" ./catalina.sh run 在以下情况下失败: Using CATALINA_BASE: /root/apache-tomcat-6.0.37 Using CATALINA_HOME: /root/apach

我需要通过JAVA_OPTS环境变量将多个系统属性传递给Tomcat 6。我似乎无法传递包含空格的系统属性:

JRE_HOME=/root/jre1.6.0_34/ JAVA_OPTS="-DsysProp1=foo -DsysProp2=bar with spaces" ./catalina.sh run
在以下情况下失败:

Using CATALINA_BASE:   /root/apache-tomcat-6.0.37
Using CATALINA_HOME:   /root/apache-tomcat-6.0.37
Using CATALINA_TMPDIR: /root/apache-tomcat-6.0.37/temp
Using JRE_HOME:        /root/jre1.6.0_34/
Using CLASSPATH:       /root/apache-tomcat-6.0.37/bin/bootstrap.jar
Exception in thread "main" java.lang.NoClassDefFoundError: with
Caused by: java.lang.ClassNotFoundException: with
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: with.  Program will exit.   
我四处看了看,答案似乎没有帮助。尝试了所有这些都没有成功:

JRE_HOME=/root/jre1.6.0_34/ JAVA_OPTS="-DsysProp1=foo -DsysProp2=\"bar with spaces\"" ./catalina.sh run

JRE_HOME=/root/jre1.6.0_34/ JAVA_OPTS='-DsysProp1=foo -DsysProp2="bar with spaces"' ./catalina.sh run

JRE_HOME=/root/jre1.6.0_34/ JAVA_OPTS='-DsysProp1=foo -DsysProp2=bar\ with\ spaces' ./catalina.sh run

好的。感谢您提供实际脚本的链接。 下面是
catalina.sh
所做的:

exec "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS # ... more stuff
所以不管你做什么,它都会被空间分割。如果不更改
catalina.sh
文件,就无法修复该问题


此页详细回答问题:

作为替代,您可以将属性设置放入
conf/catalina.properties
而不是使用
JAVA\u OPTS
。这是一个标准的
java.util.Properties
格式文件,因此您无需引用任何内容,它只需将第一个等号、冒号或空格之前的所有内容作为属性名称,并将其之后的所有内容作为值:

sysProp2=带空格的条形图
如果无法(或不希望)直接修改该文件,可以将其复制到其他位置,编辑副本,然后传递

-Dcatalina.config=file:/path/to/copy/of/catalina.properties

JAVA\u中选择
从那里加载您的属性。

能否显示cataline.sh脚本?可能问题在于scriptcatalina.sh是Tomcat的启动脚本,所以我不想修改它。你可以在这里看一下:我担心你的所有路径都在
/root
-我希望你不是以root用户的身份运行Tomcat…这是一个我唯一用于测试的VM:)不过我还是建议你以非特权用户的身份运行测试,否则,您将无法真正测试在生产环境中运行的相同设置。请详细说明为什么它会被空格分割?因为在bash中,单词分割就是这样工作的。我之所以添加到bash常见问题解答的链接是有原因的。这里也提供了几种解决方案。你能举个例子说明在catalina.properties中写什么吗?@ElliottB我添加了更多细节-这是一个标准属性文件,因此不需要引用。我在catalina.properties中尝试了以下行,但没有任何效果。我也尝试过向行中添加垃圾,但Tomcat似乎忽略了这一点<代码>-Djavax.sound.sampled.SourceDataLine=#Nvidia[plughw:0,0]
啊,谢谢你,成功了。但今天我发现,设置JAVA选项的首选位置是
CATALINA\u BASE/bin/setenv.sh