解决java.lang.NoSuchMethodError问题

当我看到这行报错的时候:
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.