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

Struts2 Tomcat 啟動異常:ClassNotFoundException: StrutsPrepareAndExecuteFilter 完整解決方案

     編輯:Java 綜合教學

異常堆疊

嚴重: Exception starting filter struts2
java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

核心原因

Eclipse 發布專案時,未將 User Library 引用的 Jar 包自動複製到 WEB-INF/lib 目錄。 編譯期類別路徑正確,但運行期 Tomcat 類加載器只掃描 WEB-INF/lib,找不到 Struts2 核心類。

三種解決方案對比

方案一:棄用 User Library,手動拷貝 Jar 到 WEB-INF/lib(成功,但不推薦)

將所有 Jar 直接拖入 WebContent/WEB-INF/lib。雖能解決問題,但失去了 User Library 統一管理、跨專案複用的優勢,且專案體積膨脹。

方案二:將 Tomcat 啟動模式從 Debug 改為 Run(失效)

路徑:Window → Preferences → MyEclipse → Servers → 選中 Tomcat → Launch 選 Run。實測此法無法解決類加載問題,屬於誤傳方案。

方案三:配置 Deployment Assembly 將 User Library 納入發布路徑(成功,推薦)

此為標準解法,讓 Eclipse 發布時自動將 User Library 的 Jar 複製到 WEB-INF/lib。

  1. 右鍵專案 → Properties → Deployment Assembly。
  2. 點擊 Add... → 選擇 Java Build Path Entries → Next。
  3. 勾選之前建立的 Struts2-Core、Hibernate-Core 等 User Library → Finish。
  4. 重新發布專案(Clean + Publish),啟動 Tomcat 驗證。

Deployment Assembly 新增

選擇 Build Path Entries

勾選 User Library

配置完成

深度原理補充

Deployment Assembly 定義了專案構建輸出到伺服器的映射規則。將 User Library 加入其中,等同於告訴 Eclipse:「發布 WAR 時,請把這些程式庫的 Jar 也打包進 WEB-INF/lib」。這符合 Java EE 標準 Web 應用打包規範,也是 Maven/Gradle 等構建工具的默認行為。

避坑檢查清單

  • 確認 web.xml 中 filter-class 全限定名拼寫正確(Struts 2.3+ 為 StrutsPrepareAndExecuteFilter)。
  • 檢查 struts.xml 是否放在 src 根目錄(編譯到 WEB-INF/classes)。
  • 若使用 Maven,無需手動配置,只需在 pom.xml 正確聲明依賴,打包類型為 war 即可自動處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved