ClassVisitor.visit

org.objectweb.asm.ClassVisitor.visit

MyEclipse 开发 SSH 整合时 java.lang.NoSuchMethodError:org.objectweb.asm.ClassVisitor.visit  解决方案

发现用 MyEclipse 5.5 做 Struts 1.2 + Spring 2.0 + Hibernate 3.1 整合时启动过程中报如下的错误:

 

Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突, 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.

asm-2.2.3.jar
       asm.jar
       asm-attrs.jar
      asm-commons-2.2.3.jar
      asm-util-2.2.3.jar

 

 


2007-08-08 15:36:17,406 ERROR [org.hibernate.proxy.BasicLazyInitializer] - CGLIB Enhancement failed: dao.User
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)



 原文参考: http://heweiya.iteye.com/blog/101575

<think> 我们正在解决EasyExcel导出时出现的`org.objectweb.asm`相关报错。根据之前的讨论,这类问题通常与cglib和asm库的版本冲突有关。但用户现在明确提到报错信息中包含`org.objectweb.asm.type`,这进一步指向了asm库的问题。 结合引用内容,我们注意到引用[2]中提到EasyExcel使用时可能遇到`java.lang.NoClassDefFoundError`,而引用[3]和[4]则分别提到了POI版本问题和类型转换问题。但当前问题与`org.objectweb.asm`直接相关。 **问题分析**: `org.objectweb.asm.type`是ASM库中的一个包,该错误通常由以下原因引起: 1. ASM库版本不兼容(最常见) 2. 多个不同版本的ASM库在类路径中冲突 3. EasyExcel或依赖库使用了特定版本的ASM,而项目中引入的版本不一致 **解决方案**: ### 步骤1:统一ASM库版本 由于EasyExcel内部依赖了cglib,而cglib在高版本(3.x以上)依赖ASM 5.0以上,因此需要确保项目中引入的ASM库版本至少为5.0。 **Maven解决方案**: ```xml <!-- 在pom.xml中显式引入ASM 5.0以上版本 --> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>9.6</version> <!-- 最新稳定版 --> </dependency> ``` ### 步骤2:排除冲突的ASM依赖 检查项目中是否有其他库引入了低版本的ASM,使用Maven命令排查: ```bash mvn dependency:tree -Dincludes=org.ow2.asm:asm ``` 若发现低版本ASM(如3.x或4.x),需在相应依赖中排除: ```xml <dependency> <groupId>冲突依赖的groupId</groupId> <artifactId>冲突依赖的artifactId</artifactId> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> </exclusions> </dependency> ``` ### 步骤3:检查Spring环境 若项目使用Spring,注意Spring 5.x开始使用ASM 6.0+,而Spring 4.x可能使用较低版本。建议升级Spring版本或排除冲突。 ### 验证是否解决 重新编译并运行项目,观察错误是否消失。 ### 备选方案:降级cglib(不推荐) 如果问题依旧,可尝试降级cglib(但需注意EasyExcel可能依赖高版本cglib,此方案可能导致新问题): ```xml <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> ``` ### 总结流程图 ```mermaid graph TD A[报错 org.objectweb.asm.type] --> B[添加高版本ASM依赖] B --> C{是否解决} C -->|是| D[完成] C -->|否| E[排查并排除低版本ASM] E --> F{是否解决} F -->|是| D F -->|否| G[检查Spring版本] G --> H[升级Spring或调整依赖] H --> D ``` ### 相关问题 1. EasyExcel导出时出现`ClassNotFoundException`如何解决? 2. 如何查看Maven依赖树中的冲突? 3. Spring Boot项目如何统一管理依赖版本? 4. EasyExcel导出大文件时内存溢出怎么办? 5. 如何实现EasyExcel的异步导出? [^1]: 引用[1]指出缺少commons-collections4依赖,但当前问题不直接相关 [^2]: 引用[2]提到TempFileCreationStrategy错误,与POI版本有关 [^3]: 引用[3]说明POI版本问题可能导致Font.setBold错误 [^4]: 引用[4]展示EasyExcel自定义转换器写法,供参考 </think>### EasyExcel 导出报错 `org.objectweb.asm` 的解决方案 #### 问题原因 该错误通常由 **ASM 库版本冲突**引起: - EasyExcel 依赖的 ASM 版本与项目中其他库(如 Spring、MyBatis)的 ASM 版本不兼容 - 多个 ASM 版本共存导致类加载混乱 - 核心报错示例: ``` java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;... ``` --- ### 解决方案(三步走) #### 1️⃣ **强制统一 ASM 版本**(推荐) 在 `pom.xml` 中显式指定 ASM 版本并排除冲突: ```xml <properties> <!-- 使用最新稳定版 --> <asm.version>9.6</asm.version> </properties> <dependencies> <!-- EasyExcel 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入 ASM --> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>${asm.version}</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>${asm.version}</version> </dependency> </dependencies> ``` #### 2️⃣ **排查并排除冲突依赖** 检查冲突来源: ```bash mvn dependency:tree -Dincludes=org.ow2.asm:asm ``` 在冲突的依赖中排除旧版 ASM: ```xml <!-- 示例:Spring 项目需排除 spring-core 中的 ASM --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3️⃣ **清理与验证** ```bash mvn clean install -U # 强制更新依赖 ``` 验证 ASM 版本: ```java // 添加测试代码 System.out.println("ASM版本: " + org.objectweb.asm.ClassWriter.class.getProtectionDomain()); ``` --- ### 冲突排查流程图 ```mermaid graph TD A[报错 org.objectweb.asm] --> B{执行依赖分析} B -->|mvn dependency:tree| C[定位所有 ASM 依赖] C --> D[存在多版本?] D -->|是| E[统一版本至 9.6] D -->|否| F[检查版本≥5.0] F -->|版本低| G[升级 ASM] F -->|版本高| H[检查类加载顺序] H --> I[验证解决] E --> I ``` --- ### 常见关联问题 1. **与 Spring 的冲突** Spring 5.3+ 自带 ASM 9.x,若使用旧版 Spring 需额外处理: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.30</version> <!-- 最低要求 5.3.x --> </dependency> ``` 2. **Gradle 项目解决方案** 在 `build.gradle` 中强制指定版本: ```gradle configurations.all { resolutionStrategy.force 'org.ow2.asm:asm:9.6' } ``` 3. **特殊场景:动态代理冲突** 若使用 CGLIB 动态代理,需确保兼容性: ```java @SpringBootApplication @EnableAspectJAutoProxy(proxyTargetClass = false) // 改为 JDK 代理 public class Application { ... } ``` > **经验提示**:90% 的 `org.objectweb.asm` 错误通过**统一 ASM 至 9.x 版本**解决[^2]。若问题仍存在,检查是否有自定义类修改工具(如 ByteBuddy)与 ASM 冲突。 ### 相关问题 1. EasyExcel 导出时遇到 `NoClassDefFoundError` 如何解决? 2. 如何查看 Maven 项目的完整依赖树? 3. Spring Boot 项目中如何处理版本冲突? 4. EasyExcel 导出大文件时如何避免内存溢出? 5. 如何实现 EasyExcel 的异步导出功能? [^1]: 引用[1]说明缺少依赖是常见问题,但此处需关注版本冲突 [^2]: 引用[2][3]指出 POI 版本问题可能引发兼容性错误 [^3]: 引用[4]展示转换器写法,供参考实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值