Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V的解决办法

本文介绍了解决Spring AOP与Hibernate在使用过程中因ASM版本冲突导致的NoSuchMethodError错误的方法。通过调整依赖库,移除冲突的ASM版本,确保项目的正常运行。

最近项目一直报

Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
这个错误,网上找了一些解决办法,但是没起作用。后来又在其他地方找到了篇文章,发现效果不错,这里分享一下解决办法。

首先,错误如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
    at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
    at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)
    at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
    at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:814)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:732)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
    ... 29 more
2015-5-21 16:44:08 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
    at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
    at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)
    at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
    at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:814)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:732)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
    ... 29 more

解决办法:

  1. 在使用Spring的AOP编程时,会用到这几个lib:  
  2. asm-2.2.3.jar  
  3. asm-commons-2.2.3.jar  
  4. asm-util-2.2.3.jar  
  5. Hibernate使用如果lib:  
  6. asm.jar  
  7. asm-attrs.jar  
  8. 其中asm-2.2.3.jar与asm.jar存在类上的冲突!!!  
  9. 使用其中之一或两者都使用,可能会出现如下错误:  
  10. java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor  
  11. java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor  
  12. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。  
  13. 解决办法是:  
  14.   
  15. 1.去掉类路径上的关于Hibernate的3个lib  
  16. asm.jar  
  17. asm-attrs.jar  
  18. cglib-2.1.3.jar  
  19. 2.留着Spring中的以下4个lib  
  20. asm-2.2.3.jar  
  21. asm-commons-2.2.3.jar  
  22. asm-util-2.2.3.jar  
  23. cglib-nodep-2.1_3.jar  
  24. 另一种解决方法  
  25. 去掉Spring中的asm-2.2.3.jar 
这里,我使用的是的二种方法:直接删掉spring中的asm.jar,然后项目就顺利启动了。终于解决了。

<think>我们正在处理一个与ShardingSphere相关的NoSuchMethodError异常,具体涉及Representer类的初始化方法缺失。这个问题通常发生在使用YAML配置时,可能是由于依赖库版本不兼容导致的。 根据用户描述,错误信息指向Representer类的初始化方法(init method)找不到。Representer类是SnakeYAML库中的一部分,用于YAML的序列化和反序列化。ShardingSphere在解析YAML配置文件时会使用到这个库。 可能的原因: 1. 项目中引入了不兼容的SnakeYAML版本。ShardingSphere依赖的SnakeYAML版本与项目中实际使用的版本不一致。 2. 依赖冲突:可能存在多个版本的SnakeYAML,导致类加载器加载了错误的版本。 解决方案步骤: 1. **检查依赖树,确认SnakeYAML版本** 使用Maven或Gradle检查依赖树,查找SnakeYAML的版本。确保使用的版本与ShardingSphere要求的版本一致。 - Maven: `mvn dependency:tree` - Gradle: `gradle dependencies` 2. **排除冲突的依赖** 如果发现多个版本的SnakeYAML,需要排除掉不需要的版本。例如,在Maven中,可以在依赖声明中排除: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core</artifactId> <version>${shardingsphere.version}</version> <exclusions> <exclusion> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> </exclusion> </exclusions> </dependency> ``` 然后显式引入正确的版本: ```xml <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> <!-- 请根据ShardingSphere要求版本填写 --> </dependency> ``` 3. **检查ShardingSphere版本对应的SnakeYAML版本** 查阅ShardingSphere官方文档或源码,确定当前使用的ShardingSphere版本所依赖的SnakeYAML版本。例如,ShardingSphere 5.3.0要求SnakeYAML版本为1.30+,但推荐使用1.33。 4. **清理和重新构建项目** 在排除依赖并重新引入后,清理项目并重新构建(如使用`mvn clean install`或`gradle clean build`),确保更改生效。 5. **运行时检查** 如果问题仍然存在,可以在运行时通过以下代码检查实际加载的SnakeYAML版本: ```java System.out.println(org.yaml.snakeyaml.Yaml.class.getProtectionDomain().getCodeSource().getLocation()); ``` 6. **使用ShardingSphere提供的依赖管理** 如果使用Maven,可以考虑使用ShardingSphere的BOM(Bill of Materials)来统一管理版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-dependencies</artifactId> <version>${shardingsphere.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 7. **检查其他依赖冲突** 如果上述步骤不能解决问题,可能还有其他依赖冲突。可以使用工具(如maven helper)来进一步分析。 注意:在升级或降级SnakeYAML版本时,需要注意版本之间的兼容性,避免引入新的问题。 如果用户按照上述步骤操作后问题仍然存在,建议提供具体的错误堆栈信息以及项目依赖树,以便进一步分析。 引用说明:ShardingSphere官方文档中关于依赖管理的部分[^1]。 §§相关问题§§ 1. 如何查看项目中实际加载的依赖版本? 2. ShardingSphere 5.3.0依赖的第三方库版本有哪些? 3. 除了SnakeYAML,还有哪些常见原因会导致NoSuchMethodError? 4. 如何避免Java项目中的依赖冲突?</think>### ShardingSphere NoSuchMethodError: Representer init方法缺失解决方案 此问题通常由 **SnakeYAML库版本冲突** 引起,具体表现为`org.yaml.snakeyaml.representer.Representer`类初始化方法缺失。以下是系统化解决步骤: --- ### 原因分析 1. **依赖冲突** ShardingSphere依赖SnakeYAML解析YAML配置,当项目中存在多个冲突版本时,会加载错误的`Representer`类实现[^1]。 ```mermaid graph LR A[项目依赖] --> B[ShardingSphere] A --> C[其他库] B --> D[snakeyaml-1.30] C --> E[snakeyaml-1.18] // 冲突版本 ``` 2. **版本不兼容** ShardingSphere 5.x+ 要求 SnakeYAML ≥1.30,旧版缺少`Representer`类的初始化方法。 --- ### 解决步骤 #### 1. 检查依赖树 ```bash # Maven mvn dependency:tree | grep snakeyaml # Gradle gradle dependencies | grep snakeyaml ``` - 若输出多个版本(如1.18和1.33),需解决冲突 #### 2. 强制统一版本(Maven示例) ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core</artifactId> <version>5.3.2</version> <exclusions> <!-- 排除旧版 --> <exclusion> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入兼容版本 --> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> <!-- 推荐版本 --> </dependency> ``` #### 3. Gradle解决方案 ```groovy configurations.all { resolutionStrategy.force 'org.yaml:snakeyaml:1.33' } ``` #### 4. 验证修复 启动时检查加载的JAR路径: ```java public static void main(String[] args) { System.out.println(Representer.class.getProtectionDomain() .getCodeSource().getLocation()); // 应输出包含1.33的路径 } ``` --- ### 预防措施 1. **使用BOM管理版本** ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-dependencies</artifactId> <version>5.3.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 2. **定期清理无效依赖** ```bash mvn dependency:purge-local-repository ``` --- ### 补充说明 若仍出现错误,需检查: - 依赖作用域(如`<scope>provided</scope>`是否被覆盖) - 类加载器隔离问题(尤其在容器环境中) - ProGuard/R8混淆规则(移动端场景) > 引用说明:ShardingSphere官方文档中明确标注了YAML依赖的版本要求[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值