在 Eclipse 開發 Servlet 時,常遇到 Tomcat 無法啟動的錯誤:Server Tomcat v7.0 Server at localhost failed to start。網路上流傳許多方案(刪除 .snap 檔、增加啟動逾時、重開機),但實際專案中最常見的真兇是:**web.xml 配置與 @WebServlet 註解衝突**。
@WebServlet("/ServletDemo")web.xml 手動配置相同的 Servlet 映射Caused by: java.lang.IllegalArgumentException:
The servlets named [ServletDemo] and [com.vivizhang.servlet.ServletDemo]
are both mapped to the url-pattern [/ServletDemo] which is not permitted
明確指出:兩個 Servlet 名稱映射到相同的 URL 模式,違反 Servlet 規範。
Servlet 3.0+ 支援兩種映射方式:
| 方式 | 配置位置 | 優先級 |
|---|---|---|
| 註解 | Servlet 類別上 @WebServlet | 自動掃描載入 |
| 部署描述符 | web.xml <servlet>/<servlet-mapping> | 手動配置 |
當兩者同時存在且映射衝突時,容器啟動失敗。
保留 @WebServlet 註解,刪除 web.xml 中對應的 <servlet> 與 <servlet-mapping> 區塊。優點:程式碼與配置合一、維護性佳。
// @WebServlet("/ServletDemo")
public class ServletDemo extends HttpServlet { ... }
保留 web.xml 配置。適用於舊專案遷移或需集中管理映射的場景。
netstat -ano | findstr 8080 檢查並終止佔用進程.metadata/.plugins/org.eclipse.core.resources/.snapweb.xml 或設定 metadata-complete="true" 停用註解掃描Tomcat 啟動失敗 90% 為配置衝突。註解與 web.xml 雙重映射衝突是 Servlet 入門最常見坑。理解 Servlet 3.0 註解掃描機制,堅持單一配置來源,即可徹底避免此類問題。