java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext
at org.apache.jasper.compiler.Validator$ValidateVisitor.(Validator.java:514)
...
JSP API 版本衝突:專案依賴的 javax.servlet.jsp:jsp-api 版本與執行環境 (Tomcat) 內建的 JSP 實作 (Jasper) 版本不相容。常見於:
jsp-api 打包進 WEB-INF/lib (scope 非 provided)。<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope> <!-- 關鍵:由容器提供,不打包 -->
</dependency>
mvn dependency:tree | grep jsp-api
# 找出引入它的模組,排除
<exclusions>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
| Tomcat | Servlet | JSP | EL |
|---|---|---|---|
| 10.1.x | 6.0 | 3.1 | 5.0 |
| 9.0.x | 4.0 | 2.3 | 3.0 |
| 8.5.x | 3.1 | 2.3 | 3.0 |
| 7.0.x | 3.0 | 2.2 | 2.2 |
確認 web.xml version 屬性與 Tomcat 版本一致。
work/Catalina/localhost/<context> 目錄 (編譯後的 JSP Servlet 快取)。clean 後重新部署。# 確認 WEB-INF/lib 無 jsp-api*.jar
ls WEB-INF/lib/ | grep jsp-api
# 應無輸出
將 jsp-api 設為 provided 並清理編譯快取,通常即可解決 AbstractMethodError。