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

解決 JSP 編譯錯誤:JspFactory.getJspApplicationContext 未定義

     編輯:Java 綜合教學

解決 JSP 編譯錯誤:JspFactory.getJspApplicationContext 未定義

專案部署至 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 方法。

解決方案

  1. 刪除專案中的衝突 JAR: 從 WEB-INF/lib 移除 jsp-api.jar、servlet-api.jar、jsp.jar、jasper*.jar 等容器提供的 API/實現包。
  2. Maven 依賴設置為 provided:
    <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>
  3. 若必須打包 (如 Spring Boot 打 WAR 部署外部 Tomcat): 確保打包工具排除容器提供的依賴,或使用 spring-boot-starter-tomcat 的 provided 範圍。

驗證步驟

  1. 清理專案:mvn clean / IDE Clean
  2. 重新部署至 Tomcat
  3. 訪問 JSP 頁面,確認無編譯錯誤

原理補充:Tomcat 類加載機制

  • WebAppClassLoader (Web 應用) 優先載入 WEB-INF/lib 和 WEB-INF/classes
  • 若應用打包了容器 API,會遮蔽容器實現類,導致 LinkageError、NoSuchMethodError、介面不匹配等
  • 鐵律: Servlet/JSP/JSTL/EL 等容器規範 API,**務必設為 provided 範圍**,絕不隨應用打包。

常見同類問題速查

錯誤現象典型衝突 JAR解決
NoSuchMethodError: ServletContext.getVirtualServerNameservlet-api.jar 版本過低設為 provided,升級版本匹配容器
ClassNotFoundException: javax.el.ExpressionFactoryel-api.jar 缺失或版本錯provided 引入正確版本
JasperException: PWC6188jasper.jar 衝突移除專案中的 jasper*.jar

遵循「依賴容器提供,不隨應用打包」原則,可徹底杜絕此類部署期謎之報錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved