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

解決 CGLIB 動態代理 NoSuchMethodError:asm 包衝突終極方案

     編輯:Java 綜合教學

錯誤現象

在使用 CGLIB 動態代理(如 Spring AOP、Hibernate 增強)時,啟動拋出:

Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

根因分析

ASM 版本衝突。CGLIB 內部依賴 ASM 字節碼操作庫。若項目傳遞依賴引入了多個版本的 asm.jar(如 asm:asm、asm:asm-commons、cglib:cglib 自帶的舊版 ASM),類加載器載入較舊版本的 ClassWriter,導致方法簽名不匹配。

解決方案:使用 cglib-nodep

cglib-nodep(nodep = no dependencies)將 ASM 類重新打包至 org.objectweb.asm → net.sf.cglib.core.asm 命名空間,完全隔離與外部 ASM 依賴,徹底消除衝突。

Maven 依賴調整

<!-- 移除舊版 cglib 與獨立 asm 依賴 -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>3.3.0</version> <!-- 推薦 3.x 版本 -->
</dependency>

Gradle 依賴調整

implementation 'cglib:cglib-nodep:3.3.0'

驗證步驟

  1. 執行 mvn dependency:tree | grep asm 確認無 asm:asm 殘留。
  2. 啟動項目,AOP 代理正常創建,錯誤消失。

擴展:Spring Boot 內置處理

Spring Boot 2.x 起預設依賴 spring-boot-starter-aop → spring-aop → cglib-nodep,通常無需手動干預。若自行引入 cglib:cglib 需排除傳遞依賴:

<dependency>
    <groupId>cglib</groupId><artifactId>cglib</artifactId>
    <exclusions><exclusion><groupId>asm</groupId><artifactId>asm</artifactId></exclusion></exclusions>
</dependency>

總結

遇到 ASM 相關 NoSuchMethodError/NoClassDefFoundError,首選升級至 cglib-nodep 3.x。這是社區公認的最穩健方案,避免在依賴地獄中手動排除版本。

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