java.lang.NoSuchMethodError: net.sf.cglib.core.Signature
今天二次开发Dubbo-admin的管理平台,开启tomcat直接报错,错误关键字为“ java.lang.NoSuchMethodError: net.sf.cglib.core.Signature”,幸好dubbo框架在业界用的比较多,很快到了错误解决方法。
这个错误是因为添加的自己项目jar包中和原有的dubbo中引用的jar包冲突导致。
解决方法和步骤
1. 查看异常堆栈信息
堆栈信息很长,但基本有两部分内容:一是运行时抛出的错误信息;二是“Caused by”后面的具体原因说明。
我们主要看第二部分(Caused by: java.lang.NoSuchMethodError: net.sf.cglib.core.Signature.<init>(Ljava/lang/String;Lnet/sf/cglib/asm/Type;[Lnet/sf/cglib/asm/Type;)V)这些信息。
2. 分析冲突类
从异常堆栈信息中可以明显看出是“Signature”这个类出了问题,然后再IDE中查询出这个类都在哪些类中。
以IntelliJ IDEA为例,在应用中双击“shit”键即可看到该类在哪些包中,搜索的时候记得带上完整的包路径名称,即“net.sf.cglib.core.Signature”,搜索结果如下:
我们可以明显的看出,“net.sf.cglib.core.Signature”这个类存在于两jar包中,cglib-nodep:2.2.2和cglib:2.2.2。
3.确定冲突jar包
找个了冲突的两个包后,我们就要接着分析是哪个包引起的冲突,以及需要保留哪个去除掉哪个。
这时候就需要接着看之前的异常堆栈信息了:
at com.alibaba.citrus.util.internal.DynamicClassBuilder.getSignature(DynamicClassBuilder.java:54)
这一行,指明了调用类及方法:DynamicClassBuilder.java。同样在idea中我们打开这个类的源码,并查看地54行代码:
- protected Signature getSignature(Method method, String rename) {
- String name = defaultIfNull(trimToNull(rename), method.getName());
- Type returnType = Type.getType(method.getReturnType());
- Type[] paramTypes = Type.getArgumentTypes(method);
- return new Signature(name, returnType, paramTypes);
- }
接着在代码中,通过点击Signature类名,即可定位DynamicClassBuilder类中引用的Signature类在哪个包中:
很明显,应用中真正依赖的是cglib-nodep:2.2.2这jar包,那么引起冲突的jar包是cglib:2.2.2。
4.排除冲突的包
冲突jar包定位到了之后,我们就需要再maven工程的pom.xml文件中将冲突jar给排除掉,使用“exclusion”命令即可:
1 <!-- 添加printerServer -->
2 <dependency>
3 <groupId>com.founder</groupId>
4 <artifactId>dubbo-printer</artifactId>
5 <version>0.0.3-SNAPSHOT</version>
6 <exclusions>
7 <exclusion>
8 <groupId>org.glassfish.hk2.external</groupId>
9 <artifactId>cglib</artifactId>
10 </exclusion>
11 </exclusions>
12 </dependency>
相关文章
- [Java基础] java多线程关于消费者和生产者
- Java实现 LeetCode 598 范围求和 II(最小值相乘)
- Java实现LeetCode 139 单词拆分
- Java实现N的N次幂
- 使用java.net.URLConnection发送http请求
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】eclipse里代码整个前移或者后移的快捷键
- java中的内存一般分成几部分?
- 在Java中可以使用自定义的java.net.InetAddress实现来解决虚拟hosts的问题
- Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用)
- Atitit. 获取cpu占有率的 java c# .net php node.js的实现
- Atitit.http httpclient实践java c# .net php attilax总结
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle
- Atitit.收银机小票打印功能的设计 java php c#.net版本
- Atitit.得到网络邻居列表java php c#.net python
- Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php
- Gcexcel 5.0 for Java and Net
- 【java】Java中-> 是什么意思?
- Java学习路线-40:Java数据库编程基础操作
- "Connection refused" when syncing Maven project in 2021.1 : java.rmi.ConnectException: Connection...
- java中的transient 详细总结Java中transient关键字 对象写出流ObjectOutputStream 对象写入流ObjectInputStream
- java安全编程
- Java基础系列
- 华为校招机试 - 简单的自动曝光、平均像素值(Java & JS & Python)
- 【java】Java并发编程系列- volatile关键字(高并发中特实用哦)