欢迎光临散文网 会员登陆 & 注册

解决java.lang.NoSuchMethodError问题

2020-02-18 09:45 作者:刘开基  | 我要投稿

当我看到这行报错的时候:

java.lang.NoSuchMethodError: redis.clients.jedis.Jedis.setkeylist(Ljava/lang/String;Ljava/util/Map;I)Ljava/lang/Long;

我总是以为自己打的jar包里面缺少依赖。但是写了一个Test方法在离线测试机上成功运行后,我就把焦点转向java依赖包冲突问题。

我猜测公司内部的jedis依赖和集群公网的jedis在一些方法名上有冲突。最后亲手实践,一种解法,把依赖项包名做主动shade:

在maven打包uber-jar(jar-with-dependency)的时候,在该plugin里面添加reloactions配置:

<relocations>
   <relocation>
       <pattern>redis.clients.jedis</pattern>
       <shadedPattern>shaded.clients.jedis</shadedPattern>
   </relocation>
</relocations>


把redis.clients.jedis包名,做了修改,改成shaded.clients.jedis。


还有一种解法,就是让执行环境直接忽略外部依赖,仅用内部依赖的方法。在正常环境里面用java参数来控制,在spark集群上,用以下两个参数:

spark.driver.extraClassPath=__app__.jar

spark.executor.extraClassPath=__app__.jar


Good luck.

解决java.lang.NoSuchMethodError问题的评论 (共 条)

分享到微博请遵守国家法律