修改 JSP 後熱部署刷新,控制台拋出:
java.lang.NoSuchFieldError: deferredExpression
at org.apache.taglibs.standard.tag.common.core.ForEachSupport.release(ForEachSupport.java:178)
...
WEB-INF/lib 下存在多個 JSTL 實現 jar 包(如 jstl.jar、standard.jar、javax.servlet.jsp.jstl-api.jar、jstl-impl.jar 等不同版本混雜),導致類載入器載入到不兼容的類版本,欄位 deferredExpression 缺失。
WEB-INF/lib 目錄,列出所有 JSTL 相關 jar:ls WEB-INF/lib/ | grep -i jstl
# 典型衝突組合:
# jstl-1.2.jar + standard-1.1.2.jar (舊版)
# javax.servlet.jsp.jstl-api-1.2.1.jar + jstl-impl-1.2.jar (新版)
javax.servlet.jsp.jstl-api-1.2.1.jar + jstl-impl-1.2.jar (JSTL 1.2 標準實現)jstl-1.2.jar (包含 API+實現,但需確保無 standard.jar)<!-- Maven: 僅引入標準 API 與參考實現 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
</dependency>
<!-- 排除傳遞依賴中的舊版 standard.jar -->
<dependency>
<groupId>some.legacy</groupId>
<artifactId>legacy-lib</artifactId>
<exclusions>
<exclusion>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
</exclusion>
</exclusions>
</dependency>
mvn clean / IDE Clean)。<c:forEach> 的 JSP,確認無異常。| 現象 | 原因 | 解決 |
|---|---|---|
EL 表達式不解析(原樣輸出 ${var}) | web.xml servlet 版本 < 2.4 或 isELIgnored="true" | 升級 web.xml 至 3.0+;移除 page 指令 isELIgnored |
| ClassNotFound: ForEachSupport | 缺少 jstl-impl jar | 補全實現依賴 |
| 標籤庫 URI 找不到 | taglib 指令 uri 錯誤或 jar 缺失 | 使用標準 URI: https://java.sun.com/jsp/jstl/core |