訪問 https://localhost:8080/qiaoliang_demo/getBarcode 返回 404 或 500,控制台提示 ClassNotFoundException 或 NoClassDefFoundError。
Action 類未被正確編譯到 classpath,或包路徑配置與實際不符。Struts2 通過類全限定名實例化 Action,找不到類即拋出此異常。
<package name="default" namespace="/" extends="struts-default">
<action name="getBarcode" class="com.example.action.BarcodeAction"> <!-- class 必須是全限定名 -->
<result>/success.jsp</result>
</action>
</package>
class 屬性值必須與 Java 類的 package 聲明 + 類名完全一致。target/classes/com/example/action/BarcodeAction.class (Maven) 或 WEB-INF/classes/com/example/action/BarcodeAction.class。wtpwebapps/項目名/WEB-INF/classes/ 下是否存在對應 .class 文件。// BarcodeAction.java
package com.example.action; // 必須與 struts.xml 中 class 前綴一致
public class BarcodeAction extends ActionSupport {
public String execute() { return SUCCESS; }
}
WEB-INF/lib/ 下是否包含 struts2-core-x.x.x.jar、ognl-x.x.x.jar、commons-lang3-x.x.jar 等核心依賴。mvn clean compile package 重新構建 WAR。/qiaoliang_demo/getBarcodenamespace="/" 對應根路徑,name="getBarcode" 對應 Action 名。namespace="/barcode",則 URL 應為 /qiaoliang_demo/barcode/getBarcode。| 錯誤類型 | 典型提示 | 根因 | 解決 |
|---|---|---|---|
| ClassNotFoundException | java.lang.ClassNotFoundException: com.xxx.Action | 類文件不在 classpath | 檢查編譯輸出、部署結構、包名拼寫 |
| NoClassDefFoundError | java.lang.NoClassDefFoundError: com/xxx/Action | 類依賴缺失/靜態初始化失敗 | 檢查依賴包、靜態塊異常 |
| NoSuchMethodError | java.lang.NoSuchMethodError: execute() | Action 方法簽名不符 | 確保 public String execute() 無參 |
| 404 Not Found | HTTP 404 | namespace/action name 不匹配 | 核對 struts.xml 與 URL 路徑 |
struts.devMode = true (struts.properties),獲取詳細錯誤堆棧。logs/catalina.out 或 logs/localhost.yyyy-mm-dd.log。https://localhost:8080/項目名/ 確認項目部署成功。jar tf 项目.war | grep BarcodeAction 驗證 WAR 包內類文件存在性。src/
├── main/
│ ├── java/
│ │ └── com/example/action/BarcodeAction.java
│ ├── resources/
│ │ └── struts.xml (放在 classpath 根目錄)
│ └── webapp/
│ └── WEB-INF/web.xml
└── test/
ClassNotFound 90% 由包名不匹配或類未編譯到部署目錄引起。核對 struts.xml 中 class 屬性與 Java 類 package 聲明,確保 Maven/IDE 正確編譯輸出至 WEB-INF/classes,重新部署即可解決。