You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat 8.5配置javaagent时$后内部类名JVM参数丢失问题

问题原因

该问题是bash脚本的多层变量解析导致的:
你在setenv.sh中用了单斜杠\转义$,仅能避免第一层setenv.sh解析时把$PoolGuardConnectionWrapper识别为环境变量。Tomcat启动脚本后续处理CATALINA_OPTS参数时,会执行第二次bash解析,此时你转义后得到的普通$会再次被识别为变量前缀,由于系统中不存在PoolGuardConnectionWrapper这个环境变量,会被直接替换为空值,导致$后的内容丢失。

解决方法

以下两种方案二选一即可:

  • 方案一:对$做双重转义,把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"

三层转义符\\\$经过第一次setenv.sh解析后会变成\$,第二次Tomcat脚本解析时\$就会被识别为普通$字符原样传递给JVM。

  • 方案二:用单引号包裹javaagent的完整参数,单引号内的所有特殊字符不会被bash做变量解析,直接原样传递,修改后配置如下:
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'

内容的提问来源于stack exchange,提问作者WestFarmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:18:04