首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

解決 JSTL forEach 標籤刷新報錯:重複 jar 包衝突排查指南

     編輯:Java 相關知識

錯誤現象

修改 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 缺失。

解決步驟

  1. 檢查 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 (新版)
  1. 只保留一套匹配的版本:
  • 推薦:javax.servlet.jsp.jstl-api-1.2.1.jar + jstl-impl-1.2.jar (JSTL 1.2 標準實現)
  • 或舊專案:jstl-1.2.jar (包含 API+實現,但需確保無 standard.jar)
  1. 刪除多餘 jar,重啟應用伺服器(Tomcat/Jetty 等)。

Maven/Gradle 依賴管理建議

<!-- 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>

驗證修復

  1. 清理專案編譯輸出(mvn clean / IDE Clean)。
  2. 重新部署 WAR。
  3. 訪問含 <c:forEach> 的 JSP,確認無異常。

延伸:其他常見 JSTL 問題

現象原因解決
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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved