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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:54