首页 > 解决方案 > tomcat jvm参数丢失

问题描述

我想用 javaagent 运行 tomcat。

setenv.sh:

export JAVA_HOME=/home/ggfan/1-install/java/jdk1.8.0_271
export CATALINA_OPTS="${CATALINA_OPTS} -javaagent:/home/ggfan/2-work/centuari-space/jdbc-leak-detector/target/jdbcld.jar=/home/ggfan/3-tmp/logs/jdbcld,INFO,org.apache.commons.dbcp.PoolingDataSource\$PoolGuardConnectionWrapper"

调用startup.sh,似乎tomcat正确选择了它:

[ggfan@localhost bin]$ ./startup.sh 
Using CATALINA_BASE:   /home/ggfan/1-install/apache-tomcat-8.5.64
Using CATALINA_HOME:   /home/ggfan/1-install/apache-tomcat-8.5.64
Using CATALINA_TMPDIR: /home/ggfan/1-install/apache-tomcat-8.5.64/temp
Using JRE_HOME:        /home/ggfan/1-install/java/jdk1.8.0_271
Using CLASSPATH:       /home/ggfan/1-install/apache-tomcat-8.5.64/bin/bootstrap.jar:/home/ggfan/1-install/apache-tomcat-8.5.64/bin/tomcat-juli.jar
Using CATALINA_OPTS:    -javaagent:/home/ggfan/2-work/centuari-space/jdbc-leak-detector/target/jdbcld.jar=/home/ggfan/3-tmp/logs/jdbcld,INFO,org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
Tomcat started.

但是,从tomcat日志:

24-Sep-2021 15:45:04.437 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -javaagent:/home/ggfan/2-work/centuari-space/jdbc-leak-detector/target/jdbcld.jar=/home/ggfan/3-tmp/logs/jdbcld,INFO,org.apache.commons.dbcp.PoolingDataSource

'$' 符号后的内部类名丢失,我的 javaagent 收到的真正参数是不完整的。

怎么了?

我在 Fedora 31 上使用 tomcat Apache Tomcat/8.5.64 运行

标签: bashtomcat

解决方案


为了拆分CATALINA_OPTS成单词并将它们作为参数传递给javacatalina.sh脚本使用eval

eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
...

这显然在 上执行变量扩展$PoolGuardConnectionWrapper。为了防止这种情况两次转义美元符号:

export CATALINA_OPTS="${CATALINA_OPTS} ...PoolingDataSource\\\$PoolGuardConnectionWrapper"

推荐阅读