Tomcat 6 起解壓版 (zip/tar.gz) 不再強制要求環境變量,但生產環境多實例、腳本自動化、容器化部署場景下,顯式配置 JAVA_HOME、CATALINA_HOME、CATALINA_BASE 是專業運維的基礎。本文梳理標準定義、配置方法、多實例隔離模式與常見誤區。
| 變量名 | 含義 | 典型值 | 是否必設 |
|---|---|---|---|
| JAVA_HOME | JDK 安裝根目錄 (含 bin、lib、include) | /usr/lib/jvm/java-11-openjdk C:\Program Files\Java\jdk-17 | 必設 - 所有啟動腳本依賴 %JAVA_HOME%\bin\java |
| CATALINA_HOME | Tomcat 安裝根目錄 (含 bin、lib、webapps 等只讀文件) | /opt/tomcat9 D:\Tomcat9 | 解壓版建議設,安裝版 (exe/msi) 通常自動註冊服務無需手動設 |
| CATALINA_BASE | Tomcat 實例運行目錄 (含 conf、logs、webapps、work、temp 等可寫文件) | /var/tomcat-instance1 D:\TomcatInstances\inst1 | 多實例必設,單實例通常等同 CATALINA_HOME |
| JRE_HOME | JRE 目錄 (僅運行不編譯時可用) | /usr/lib/jvm/java-11-openjdk/jre | 可選,未設則回退 JAVA_HOME |
# /etc/profile.d/tomcat.sh (推薦,系統級)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export CATALINA_HOME=/opt/tomcat9
export CATALINA_BASE=/var/tomcat-prod
export PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
JAVA_HOME = C:\Program Files\Java\jdk-17CATALINA_HOME = D:\Tomcat9Path,追加 %JAVA_HOME%\bin;%CATALINA_HOME%\binCATALINA_BASE在 $CATALINA_BASE/bin/setenv.sh (Linux) 或 %CATALINA_BASE%\bin\setenv.bat (Windows) 中定義,不污染系統環境、隨實例遷移、版本升級不受影響。
# setenv.sh
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export CATALINA_HOME=/opt/tomcat9
export CATALINA_BASE=/var/tomcat-prod
export CATALINA_OPTS="-server -Xms2g -Xmx2g -XX:+UseG1GC"
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
rem setenv.bat
set JAVA_HOME=C:\Program Files\Java\jdk-17
set CATALINA_HOME=D:\Tomcat9
set CATALINA_BASE=D:\TomcatInstances\prod
set CATALINA_OPTS=-server -Xms2g -Xmx2g -XX:+UseG1GC
set JAVA_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai
mkdir -p /var/tomcat-inst1/{conf,logs,webapps,work,temp}cp $CATALINA_HOME/conf/* /var/tomcat-inst1/conf/server.xml 端口 (8080→8081, 8005→8006, 8443→8444 等)start-inst1.sh:#!/bin/bash
export CATALINA_BASE=/var/tomcat-inst1
export CATALINA_HOME=/opt/tomcat9
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
$CATALINA_HOME/bin/startup.sh
優勢:二進制唯一、配置隔離、日誌隔離、滾動升級零停機 (切換 CATALINA_BASE 指向新版本目錄)。
Tomcat 啟動腳本 (catalina.sh/bat) 會自動構建完整類路徑:
bootstrap.jar+tomcat-juli.jar+commons-daemon.jar(Windows 服務) + 系統類路徑。
手動設定 CLASSPATH 反而會干擾類加載順序,導致 JAR 衝突、JSP 編譯失敗、JDBC 驅動找不到等疑難雜癥。
應用級依賴請放入$CATALINA_BASE/webapps/your-app/WEB-INF/lib/,共享庫放入$CATALINA_BASE/lib/(需在catalina.properties的common.loader配置)。
# Linux
$CATALINA_HOME/bin/version.sh
# 或
$CATALINA_HOME/bin/catalina.sh version
# Windows
%CATALINA_HOME%\bin\version.bat
輸出應包含:
Server version: Apache Tomcat/9.0.85
Server built: Jan 1 2024 00:00:00 UTC
Server number: 9.0.85.0
OS Name: Linux
OS Version: 5.15.0-100-generic
Architecture: amd64
JVM Version: 11.0.21+9-LTS
JVM Vendor: Eclipse Adoptium
CATALINA_BASE: /var/tomcat-prod
CATALINA_HOME: /opt/tomcat9
| 誤區 | 後果 | 正確做法 |
|---|---|---|
| JAVA_HOME 指向 JRE 而非 JDK | JSP 編譯失敗 (缺 tools.jar)、JDK 工具不可用 | 指向 JDK 根目錄 (含 bin/javac、lib/tools.jar) |
| 路徑含空格/中文且未加引號 | 腳本解析失敗、啟動報錯 | 路徑無空格最佳;必須含空格時雙引號包裹 |
| 同時設定系統 CLASSPATH 和 setenv.sh | 類加載順序混亂、版本衝突 | 僅用 setenv.sh 設定 JVM 參數,不設 CLASSPATH |
| 多實例共用同一 CATALINA_BASE | 端口衝突、日誌交織、配置互踩 | 每實例獨立 CATALINA_BASE 目錄 |
| 修改 catalina.sh/bat 而非 setenv.sh | 升級 Tomcat 時配置丟失、難以維護 | 所有自定義參數放入 setenv.sh/bat |
環境變量配置看似基礎,實則是 Tomcat 穩定運行、自動化部署、多實例隔離的基石。堅持 setenv.sh 內聯配置、CATALINA_BASE 隔離實例、拒絕手動 CLASSPATH 三原則,能消除 90% 的啟動與類加載疑難雜癥。