An attempt was made to call the method xxx.jedis but it does not exist

场景

在公司项目中做配置迁移的时候,服务启动时报错

报错信息

Description:

An attempt was made to call the method redis.clients.jedis.Jedis.<init>(Ljava/lang/String;IIIZLjavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/SSLParameters;Ljavax/net/ssl/HostnameVerifier;)V but it does not exist. Its class, redis.clients.jedis.Jedis, is available from the following locations:

    jar:file:/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/redis/clients/jedis/Jedis.class

It was loaded from the following location:

    jar:file:/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/


Action:

Correct the classpath of your application so that it contains a single, compatible version of redis.clients.jedis.Jedis

这种问题一看就是maven引入第三方依赖版本冲突或不匹配相关的问题,该问题导致这个springboot服务启动报错,其实这种报错还是看上去比较舒服的,这个报错提示是非常到位,咱们试着理解下这个报错提示

分三步部分解读报错

1、您的应用程序尝试调用 redis.clients.jedis.Jedis 类的构造函数,该构造函数的参数类型依次为java.lang.String、javax.net.ssl.SSLSocketFactory,javax.net.ssl.SSLParameters, javax.net.ssl.HostnameVerifier(<init>是构造函数的意思,是构造函数的字节码写法),但该构造函数不存在

An attempt was made to call the method 

redis.clients.jedis.Jedis.<init>(Ljava/lang/String;IIIZLjavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/SSLParameters;Ljavax/net/ssl/HostnameVerifier;)V 

but it does not exist

该构造函数不存在?是jar包冲突了吗?带着这些问题继续读第二部分的报错信息

2、该构造器所在的类redis.clients.jedis.Jedis,存在于/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/redis/clients/jedis/Jedis.class,被加载的位置是/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/,也就是说我们所部署的项目中有且只有一个jedis相关的jar包的,经排查发现项目中确实只有一个2.8.0的jedis jar包,所以可以断定这并非是项目中存在多个jedis jar包导致冲突的

 Its class, redis.clients.jedis.Jedis, is available from the following locations:

    jar:file:/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/redis/clients/jedis/Jedis.class

It was loaded from the following location:

    jar:file:/home/work/one-front-callin/app/BOOT-INF/lib/jedis-2.8.0.jar!/

3、这是报错中给的解决该问题的建议,建议我们纠正应用程序即jedis的类路径,使其包含redis.clients.jedi .jedis的单一兼容版本

Action:

Correct the classpath of your application so that it contains a single, compatible version of redis.clients.jedis.Jedis

个人理解就是项目中调用redis.clients.jedis.Jedis的版本和我们当前这个2.8版本不一样,所以调用redis.clients.jedis.Jedis的构造器时无法从2.8版本中的redis.clients.jedis.Jedis中匹配到要调用的这个构造器

redis.clients.jedis.Jedis.<init>(Ljava/lang/String;IIIZLjavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/SSLParameters;Ljavax/net/ssl/HostnameVerifier;)V 

至于是在哪个地方调用的redis.clients.jedis.Jedis的构造器我们不用太纠结,应该是某个第三方jar包中的类调用的,我们只需要找到合适的jedis jar包版本即可了

所以我查阅了下新版的jedis版本,碰巧发现jeids 2.9版本中存在这个构造器
在这里插入图片描述

所果断把2.8版本升级到2.9版本
在这里插入图片描述

问题解决

总结

所以此类问题,要么是jar包版本和项目中实际使用版本不对应,此时要修改依赖版本,要么是jar包版本冲突,需要把冲突的jar包给排掉

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值