解決java.lang.NoSuchMethodError問(wèn)題

當(dāng)我看到這行報(bào)錯(cuò)的時(shí)候:
java.lang.NoSuchMethodError: redis.clients.jedis.Jedis.setkeylist(Ljava/lang/String;Ljava/util/Map;I)Ljava/lang/Long;
我總是以為自己打的jar包里面缺少依賴(lài)。但是寫(xiě)了一個(gè)Test方法在離線測(cè)試機(jī)上成功運(yùn)行后,我就把焦點(diǎn)轉(zhuǎn)向java依賴(lài)包沖突問(wèn)題。
我猜測(cè)公司內(nèi)部的jedis依賴(lài)和集群公網(wǎng)的jedis在一些方法名上有沖突。最后親手實(shí)踐,一種解法,把依賴(lài)項(xiàng)包名做主動(dòng)shade:
在maven打包uber-jar(jar-with-dependency)的時(shí)候,在該plugin里面添加reloactions配置:
<relocations>
? ?<relocation>
? ? ? ?<pattern>redis.clients.jedis</pattern>
? ? ? ?<shadedPattern>shaded.clients.jedis</shadedPattern>
? ?</relocation>
</relocations>

把redis.clients.jedis包名,做了修改,改成shaded.clients.jedis。
還有一種解法,就是讓執(zhí)行環(huán)境直接忽略外部依賴(lài),僅用內(nèi)部依賴(lài)的方法。在正常環(huán)境里面用java參數(shù)來(lái)控制,在spark集群上,用以下兩個(gè)參數(shù):
spark.driver.extraClassPath=__app__.jar
spark.executor.extraClassPath=__app__.jar
Good luck.