【问题标题】:Passing system properties that contains spaces to Tomcat through JAVA_OPTS通过 JAVA_OPTS 将包含空格的系统属性传递给 Tomcat
【发布时间】:2013-08-23 21:32:54
【问题描述】:

我需要通过 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

【问题讨论】:

  • 你能显示 cataline.sh 脚本吗?也许问题出在那个脚本里面
  • catalina.sh 是 Tomcat 的启动脚本,所以我不想修改它。你可以在这里看看:svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_34/bin/…
  • 我担心你的所有路径都在/root 下 - 我希望你没有以 root 用户身份运行 Tomcat...
  • 这是一个我仅用于测试目的的虚拟机 :)
  • 我仍然建议以非特权用户身份运行您的测试,否则您不会真正测试与在生产环境中运行相同的设置。

标签: java bash shell tomcat tomcat6


【解决方案1】:

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

sysProp2=bar with spaces

如果您不能(或不想)直接修改该文件,您可以将其复制到另一个位置,编辑副本,然后通过

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

JAVA_OPTS 中,让它从那里加载您的属性。

【讨论】:

  • 你能举个例子说明在catalina.properties中具体写什么吗?
  • @ElliottB 我添加了更多细节 - 这是一个标准属性文件,因此不需要引用。
  • 我在 catalina.properties 中尝试了以下行,但没有任何效果。我也尝试在该行中添加垃圾,但它似乎被 Tomcat 忽略了。 -Djavax.sound.sampled.SourceDataLine=#Nvidia [plughw:0,0]
  • 啊,谢谢,成功了。但今天我发现这句话说设置 JAVA_OPTS 的首选位置是CATALINA_BASE/bin/setenv.shtomcat.apache.org/tomcat-7.0-doc/RUNNING.txt
【解决方案2】:

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

exec "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS # ... more stuff

所以无论你做什么,它都会被空格分割。如果不更改 catalina.sh 文件,则无法解决此问题。

本页详细解答问题:http://mywiki.wooledge.org/BashFAQ/050

【讨论】:

  • 您能否详细说明为什么无论如何它都会被空格分割?
  • 因为这就是 bash 中分词的工作方式。我添加 bash 常见问题解答的链接是有原因的。还提供了多种解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2019-01-24
  • 2019-06-22
  • 2017-03-02
相关资源
最近更新 更多