Linux环境下Tomcat 9启动失败:catalina.sh无法识别JAVA_OPTS
Tomcat 9 JAVA_OPTS 解析异常修复方案
问题根源
报错-Djava.security.auth.login.config=: command not found及三类异常的核心原因:
- 变量未加双引号,含空格/特殊字符时被bash拆分,导致路径/URL被误解析为多个参数甚至命令
- 未定义变量直接引用导致空值,使参数断裂成无效命令
- 换行转义格式不规范,行尾
\后带空格,导致参数拼接错误
针对性修复步骤
1. 强制为所有变量引用添加双引号
bash中未加双引号的变量会按空格拆分,必须将所有${VAR}改为"${VAR}",避免参数被意外拆分。
2. 处理未定义变量,避免空值断裂
对可能未定义的变量,使用${VAR:-}语法设置默认空值,确保即使变量为空,参数也不会断裂成单独的无效命令。
3. 修正换行转义格式
所有行尾的\必须紧跟在行末,不能有后续空格,否则bash会将空格和换行视为参数的一部分,引发解析错误。
4. 修复最后一个if代码块
原代码中[ ! -z ${CAS_SECURE} ]未加双引号,且JAAS_CONFIG等变量可能为空,需补全双引号并处理空值。
修改后的完整setenv.sh
#!/bin/bash COMMON="/usr/local/etc/BashStartFunctions.bash" [ ! -e "$COMMON" ] && echo "Missing $COMMON" && exit 1 source "$COMMON" checkUsr fetchAppEnv echo "PRG=$1" JAVA_OPTS="${JAVA_OPTS_EXTRA:-} \ -Dspring.profiles.active=dev \ -Djava.library.path=/usr/lib64:/usr/local/tomcat-apr-connector/lib:/lib64 \ -DWEBAPP-CONF-ROOT=\"${WEBAPP_CONF_ROOT:-}\" \ -Dcas.url=\"${CAS_URL:-}\" \ -Dserver.url=\"${SERVER_URL:-}\" \ -Dcom.vmd.xmltcp.client.XmltcpClient.reuseClientSocket=false \ -Dcom.aubesoft.jdbc.recovery.ChainedJdbcExecutionWithRecoveryHelper.overrideChainProcessorRecoveryFile=\"${overrideChainProcessorRecoveryFile:-}\" \ -Dcom.aubesoft.jdbc.recovery.ChainedJdbcExecutionWithRecoveryHelper.overrideInChainRecoveryFile=\"${overrideInChainRecoveryFile:-}\" \ -Dcom.aubesoft.jdbc.recovery.RecoveryPolicy.overrideDefaultRecoveryFile=\"${overrideDefaultRecoveryFile:-}\" \ -Djavax.net.ssl.trustStore=\"${TRUSTSTORE:-}\" \ -Dapp.id=\"${APP_ID:-}\" \ -Dserver.xml.serverPort=\"${SERVER_PORT:-}\" \ -Djava.awt.headless=true" if [ "$1" = "start" ];then JAVA_OPTS="${JAVA_OPTS} \ -Denv=\"${APP_ENV:-}\" \ -Dtomcat.hosts=\"${TOMCAT_HOSTS:-}\" \ -Dstore.url=\"${store_url:-}\" \ -Dlog.dir=\"${LOG_DIR:-}\" \ -Dserver.xml.httpPort=\"${HTTP_PORT:-}\" \ -Dserver.xml.ajp13Port=\"${AJP13_PORT:-}\" \ -Dserver.xml.ajp13.maxThreads=\"${AJP13_MAX_THREADS:-}\" \ -Dserver.xml.httpsPort=\"${HTTPS_PORT:-}\" \ -Dserver.xml.https.maxThreads=\"${HTTPS_MAX_THREADS:-}\" \ -Dserver.xml.https.sslCertFile=\"${HTTPS_CERT_FILE:-}\" \ -Dserver.xml.https.sslCertKeyFile=\"${HTTPS_CERT_KEY_FILE:-}\" \ -Dserver.xml.https.sslKeystoreFile=\"${HTTPS_KEYSTORE_FILE:-}\" \ -Dserver.xml.https.sslKeystorePass=\"${HTTPS_KEYSTORE_PASS:-}\" \ -Dserver.xml.https.sslKeyAlias=\"${HTTPS_KEYSTORE_KEY_ALIAS:-}\" \ -Dserver.xml.jvmRoute=\"${HOSTNAME:-}.${AJP13_PORT:-}\" \ -Dserver.xml.maxHeaderSize=\"${MAX_HEADER_SIZE:-}\" \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=\"${JMX_PORT:-}\" \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dscoperta.zone=\"${SCOPERTA_ZONE:-}\" \ -Dscoperta.env=\"${APP_ENV:-}\" \ -Dhttps.protocols=TLSv1 \ -Dsmartd.authentication.signing.secret.file=\"${SMARTD_AUTHENTICATION_SIGNING_SECRET_FILE:-}\" \ -Dspring.profiles.active=\"${SMARTD_SPRING_PROFILES:-}\"" if [ ! -z "${CAS_SECURE:-}" ]; then JAVA_OPTS="${JAVA_OPTS} \ -Djava.security.auth.login.config=\"${JAAS_CONFIG:-}\" \ -Djava.security.krb5.kdc=\"${KRB5_KDC:-}\" \ -Djava.security.krb5.realm=\"${KRB5_REALM:-}\" \ -Dcas.TGTTimeoutMS=\"${CAS_TGT_TIMEOUT_MS:-}\" \ -Dcas.secure=\"${CAS_SECURE:-}\"" fi fi CATALINA_OUT="/usr/local/tomcat-d-9/logs/catalina_${APP_ID:-}.out" echo "JAVA_OPTS=$JAVA_OPTS"
关键修改说明
- 所有变量引用添加双引号,避免空格或特殊字符拆分参数
- 为所有可能未定义的变量添加
:-默认值,确保参数完整性 - 修正行尾
\的格式,删除后续空格,保证拼接正确 - 最后一个if块中
CAS_SECURE添加双引号,避免空值判断逻辑出错
内容的提问来源于stack exchange,提问作者momodjib
相关产品推荐
相关产品推荐

