tomcat jvm 参数丢失
tomcat jvm arguments lost
我想 运行 tomcat 使用 javaagent。
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
内部 class '$' 符号后的名称丢失,我的 javaagent 收到的真实参数是不完整的。
怎么了?
我是 运行 tomcat Fedora 31 上的 Apache Tomcat/8.5.64
为了将 CATALINA_OPTS
拆分为单词并将它们作为参数传递给 java
,catalina.sh
脚本使用 eval
:
eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
...
这显然对$PoolGuardConnectionWrapper
进行了变量扩展。为防止这种转义美元符号两次:
export CATALINA_OPTS="${CATALINA_OPTS} ...PoolingDataSource\$PoolGuardConnectionWrapper"
我想 运行 tomcat 使用 javaagent。
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
内部 class '$' 符号后的名称丢失,我的 javaagent 收到的真实参数是不完整的。
怎么了?
我是 运行 tomcat Fedora 31 上的 Apache Tomcat/8.5.64
为了将 CATALINA_OPTS
拆分为单词并将它们作为参数传递给 java
,catalina.sh
脚本使用 eval
:
eval exec "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
...
这显然对$PoolGuardConnectionWrapper
进行了变量扩展。为防止这种转义美元符号两次:
export CATALINA_OPTS="${CATALINA_OPTS} ...PoolingDataSource\$PoolGuardConnectionWrapper"