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

Maven 構建 SSH 項目依賴衝突導致 Class 文件為空:排查與修復實錄

     編輯:程式設計綜合問答

故障現象

引入 org.springframework:spring-web:4.1.3.RELEASE 後,web.xml 配置 ContextLoaderListener 報錯找不到類;啟動拋 java.lang.ArrayIndexOutOfBoundsException: 60533。刪除依賴則啟動報錯。

根因定位

  1. JAR 包下載損壞:Maven 從遠程倉庫下載 spring-web-4.1.3.RELEASE.jar 時網絡波動/倉庫鏡像異常,導致 JAR 內部 .class 文件大小為 0 字節(解壓後發現)。
  2. 校驗缺失:Maven 預設不校驗 JAR 完整性(無 checksum 驗證或簽名驗證),損壞 JAR 直接進入本地倉庫並參與編譯/打包。
  3. 異常表現:ArrayIndexOutOfBoundsException 發生於 ASM 字節碼解析階段(Spring 核心用 ASM 掃描註解),讀取空 class 文件導致索引越界。

修復步驟

# 1. 刪除本地損壞制品
rm -rf ~/.m2/repository/org/springframework/spring-web/4.1.3.RELEASE

# 2. 強制重新下載(可指定鏡像)
mvn dependency:get -Dartifact=org.springframework:spring-web:4.1.3.RELEASE:jar -DremoteRepositories=aliyun::https://maven.aliyun.com/nexus/content/groups/public

# 3. 驗證 JAR 完整性
jar tf ~/.m2/repository/org/springframework/spring-web/4.1.3.RELEASE/spring-web-4.1.3.RELEASE.jar | grep ContextLoaderListener
# 應輸出 org/springframework/web/context/ContextLoaderListener.class

# 4. 清理並重建
mvn clean compile

預防機制

層面措施
倉庫層使用 Nexus/Artifactory 代理中央倉庫,開啟 校驗和驗證(MD5/SHA1),拒絕損壞制品入庫
構建層mvn --fail-never dependency:verify 或啟用 maven-enforcer-plugin 強制簽名驗證
IDE 層IDEA/Eclipse Maven 設置 Download Sources/Documentation 可選,但 Download Artifacts 必開
依賴管理統一 dependencyManagement 鎖定版本,避免傳遞依賴衝突導致多版本共存

擴展:同類「類找不到/類文件為空」排查清單

  1. mvn dependency:tree -Dverbose 檢查衝突版本(omitted for conflict)。
  2. mvn dependency:analyze 發現未聲明/未使用依賴。
  3. 檢查 target/classes、WEB-INF/lib 實際打包內容。
  4. 多模組項目確認 install 順序,父模組 install 後子模組才能解析 SNAPSHOT。

教訓:「依賴已在本地倉庫」≠「依賴可用」。異常堆疊指向核心類缺失且邏輯無誤時,優先懷疑 JAR 損壞,刪除重下載是性價比最高的第一步。

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