The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
Servlet API 包未加入項目構建路徑,導致編譯器無法解析 HttpServlet 父類。
compile 而非 provided)原理:Server Runtime 自動包含容器 lib/servlet-api.jar,且標記為「系統庫」,不會打包進 WAR。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version> <!-- Tomcat 9/10: 4.0.x; Tomcat 8: 3.1.0 -->
<scope>provided</scope> <!-- 關鍵:編譯期需要,運行期由容器提供 -->
</dependency>
Maven → Update Project 強制刷新pom.xml 無版本衝突lib/servlet-api.jar 複製到項目 WebContent/WEB-INF/lib/// 測試代碼
public class TestServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("Servlet API OK");
}
}
無紅叉、無錯誤標記即修復成功。
| 誤區 | 正確認知 |
|---|---|
| 將 servlet-api.jar 放入 WEB-INF/lib | 容器啟動會報 ClassCastException 或加載雙份類 |
| Maven scope 用 compile | 打包進 WAR,導致類加載衝突,必須用 provided |
| Tomcat 10 用 servlet-api 3.x | Tomcat 10+ 遷移至 Jakarta EE,需用 jakarta.servlet-api 5.0+ |
首選 Server Runtime,自動匹配容器版本、零配置、不侵入項目依賴。Maven 項目務必用 provided scope。這是 Eclipse Web 開發的「必修課」,一次配置,終身受益。