專案部署至 Tomcat 時遇到編譯錯誤:
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
JAR 包衝突: 專案 WEB-INF/lib 下包含的 JSP/API 相關 JAR (如 jsp-api.jar、servlet-api.jar、jasper.jar 等) 與 Tomcat 容器自帶的版本不一致,且版本較低。Tomcat 類加載器優先載入 Web 應用的 JAR (雙親委派模型破壞),導致運行時使用了舊版 JspFactory 類,缺少新版 API 方法。
WEB-INF/lib 移除 jsp-api.jar、servlet-api.jar、jsp.jar、jasper*.jar 等容器提供的 API/實現包。<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> <!-- 關鍵:編譯時用,運行時由容器提供 --> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
spring-boot-starter-tomcat 的 provided 範圍。mvn clean / IDE CleanWEB-INF/lib 和 WEB-INF/classesLinkageError、NoSuchMethodError、介面不匹配等provided 範圍**,絕不隨應用打包。| 錯誤現象 | 典型衝突 JAR | 解決 |
|---|---|---|
| NoSuchMethodError: ServletContext.getVirtualServerName | servlet-api.jar 版本過低 | 設為 provided,升級版本匹配容器 |
| ClassNotFoundException: javax.el.ExpressionFactory | el-api.jar 缺失或版本錯 | provided 引入正確版本 |
| JasperException: PWC6188 | jasper.jar 衝突 | 移除專案中的 jasper*.jar |
遵循「依賴容器提供,不隨應用打包」原則,可徹底杜絕此類部署期謎之報錯。