| 目錄/檔案 | 用途 | 關鍵說明 |
|---|---|---|
bin/ | 啟動/關閉腳本 | startup.sh, shutdown.sh, catalina.sh, setenv.sh (自定義 JVM 參數) |
conf/ | 全域配置 | server.xml (核心), web.xml (預設 Servlet 映射), context.xml, tomcat-users.xml |
lib/ | Tomcat 共享庫 | servlet-api.jar, jasper.jar, JDBC 驅動等,對所有 Webapp 可見 |
webapps/ | Web 應用部署目錄 | WAR 自動展開,ROOT/manager/host-manager 為內建應用 |
logs/ | 日誌輸出 | catalina.out, localhost.yyyy-mm-dd.log, access_log |
work/ | JSP 編譯產物 | JSP → Servlet .java/.class,清理可強制重新編譯 |
temp/ | 暫存檔 | 上傳大檔案緩衝等 |
myapp.war (或解壓目錄 myapp/)
├── index.jsp, static/
├── WEB-INF/
│ ├── web.xml (Servlet 3.0+ 可選,註解替代)
│ ├── classes/ (編譯後 .class,優先載入)
│ ├── lib/ (應用私有 JAR,僅此 Webapp 可見)
│ └── tags/, tld/ (標籤庫)
└── META-INF/
└── context.xml (應用級 Context 配置)
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<GlobalNamingResources> ... </GlobalNamingResources>
<Service name="Catalina">
<!-- 連接器:HTTP/1.1, NIO, AJP -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
acceptCount="100"
compression="on"
compressableMimeType="text/html,text/xml,application/json" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase" />
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
關鍵元素層級:Server → Service → Connector/Engine → Host → Context
$CATALINA_HOME/conf/web.xml:全域預設 (DefaultServlet, JspServlet, session-config, mime-mapping)WEB-INF/web.xml:應用覆蓋/擴充@WebServlet, @WebFilter, @WebListener) 替代https://localhost:8080/myapp/user/list 為例)HttpServletRequest/ResponseHost (localhost)/myapp) 選擇 Context/user/list → 對應 ServletBootstrap ClassLoader (JAVA_HOME/jre/lib/rt.jar)
▲
│ 父優先委派
▼
System/Application ClassLoader (CLASSPATH)
▲
│
▼
Common ClassLoader ($CATALINA_HOME/lib/*.jar) ← Tomcat 內核 + 共享庫
▲
│ 打破雙親委派 (子優先)
▼
Webapp ClassLoader (WEB-INF/classes → WEB-INF/lib/*.jar) ← 每個 Webapp 隔離
work/,同樣走 Webapp ClassLoaderservlet-api.jar → LinkageError → 移除,改用 provided scope#!/bin/bash
export CATALINA_OPTS="
-Xms2g -Xmx4g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC -XX:MaxGCPauseMillis=100
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs
-Djava.security.egd=file:/dev/./urandom
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Taipei"
# Windows 用 setenv.bat,語法調整為 set CATALINA_OPTS=...
❌ 404 Not Found → 檢查
webapps/下是否有對應目錄/WAR,server.xmlHost appBase 是否正確❌ ClassNotFound / NoClassDefFound → 類載入器衝突,檢查
WEB-INF/lib是否重複/缺漏❌ 埠口佔用 →
netstat -anp | grep 8080,修改server.xmlConnector port❌ 中文亂碼 →
URIEncoding="UTF-8"加在 Connector,確保 DB/檔案編碼一致