| 現象 | 典型原因 | 核心檢查點 |
|---|---|---|
| 雙擊 startup.bat 視窗一閃而過 | JAVA_HOME 錯誤、缺少 pause、啟動腳本錯誤 | cmd 下執行、檢查錯誤輸出 |
| 命令行啟動仍閃退 | 腳本未加 pause、錯誤導致直接退出 | 在 startup.bat 末尾加 pause |
| The JAVA_HOME environment variable is not defined correctly | JAVA_HOME 結尾含分號、指向 JRE 非 JDK、路徑有空格未加引號 | echo %JAVA_HOME%、檢查 bin/java.exe 存在性 |
| 端口被佔用 (8080/8009/8005) | 舊進程未死、其他程式佔用、IPv6/IPv4 綁定衝突 | netstat -ano \| findstr :8080、taskkill /PID |
| 載入 Servlet 報 ClassNotFound/UnsupportedClassVersionError | 編譯版本不匹配、類路徑缺失、Webapp 結構錯誤 | 檢查 WEB-INF/classes、lib、JDK 版本 |
| 啟動後自動關閉、無錯誤日誌 | 標準輸出被重導向、Logger 配置靜默、JVM Crash | 檢查 catalina.out、hs_err_pid*.log |
錯誤設定: JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202; (結尾有分號)
Tomcat 內部拼接邏輯: %JAVA_HOME%\bin\java.exe → C:\Program Files\Java\jdk1.8.0_202;\bin\java.exe → 路徑無效
正確設定: JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202 (無分號、無尾斜線)
驗證指令:
echo %JAVA_HOME%
"%JAVA_HOME%\bin\java.exe" -version
@echo off
rem 1. 判斷 OS 類型,啟用 setlocal 延遲環境變數擴展
if "%OS%" == "Windows_NT" setlocal
rem 2. 推導 CATALINA_HOME
set CURRENT_DIR=%cd%
if not "%CATALINA_HOME%" == "" goto gotHome
set CATALINA_HOME=%CURRENT_DIR%
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set CATALINA_HOME=%cd%
cd %CURRENT_DIR%
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
goto end
:okHome
set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
if not exist "%EXECUTABLE%" goto end
rem 3. 收集命令列參數
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="" "" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
rem 4. 執行 catalina.bat start
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
關鍵點:
catalina.bat startecho "%EXECUTABLE%" start %CMD_LINE_ARGS% 觀察實際命令"C:\Tomcat\bin\startup.bat" → 起始位置 設為 C:\Tomcat\bincmd /k "C:\Tomcat\bin\startup.bat" 保留視窗server.xml 缺少 <Context> 配置或路徑錯誤webapps/ROOT 是否存在、docBase 指向正確# Windows 查詢佔用 8080 的 PID
netstat -ano | findstr :8080
# 輸出範例:TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1234
taskkill /F /PID 1234
# 或修改 server.xml 變更端口
<Connector port="8088" protocol="HTTP/1.1" ... />
<Server port="8005" shutdown="SHUTDOWN"> <-- 關閉端口也可改 -->
RUNNING.txt 確認版本需求set JPDA_ADDRESS=8000 + catalina.bat jpda startcatalina.bat run (前景模式) 觀察控制台完整輸出-verbose:class 加入 JAVA_OPTS 追蹤類載入來源jstack <pid> > threaddump.txt 排查啟動卡住執行緒hs_err_pid<pid>.log 由 JVM 生成,含致命錯誤堆疊# setenv.sh (Linux) / setenv.bat (Windows)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export CATALINA_PID=$CATALINA_HOME/tomcat.pid
export JAVA_OPTS="-server -Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs \
-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Taipei \
-Djava.security.egd=file:/dev/./urandom"
# Windows 版
set JAVA_HOME=C:\Java\jdk-11
set CATALINA_PID=%CATALINA_HOME%\tomcat.pid
set JAVA_OPTS=-server -Xms2g -Xmx2g -XX:+UseG1GC ...
Tomcat 啟動失敗 90% 集中在 JAVA_HOME 設定錯誤、端口衝突、版本不匹配 三大類。建立標準化的 setenv.sh/bat、統一 JDK 版本、啟用前景模式觀察日誌、善用 netstat/jstack 診斷工具,可將排查時間從小時壓縮至分鐘。