NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor

遇到下面這個異常, 很抓雞有木有…
Caused by: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
異常如下:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'regCenter': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
Caused by: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
	at org.apache.curator.framework.listen.ListenerContainer.addListener(ListenerContainer.java:41)
	at org.apache.curator.framework.imps.CuratorFrameworkImpl.start(CuratorFrameworkImpl.java:257)
	at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.init(ZookeeperRegistryCenter.java:98)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1758)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1695)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 12 more

分析問題:(理解根源才能更好解決問題)
根本問題在於類加載器加載了這個類:

com.google.common.util.concurrent.MoreExecutors

恰巧這個類裏面沒有sameThreadExecutor()這個方法…
爲什麼會沒有這個類,或者這個類沒有這個方法, 明明我引入了下面這個依賴:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

說明了引入的所有依賴裏面不止一個MoreExecutors類. 其他dependency也間接引入了guava的依賴, 只是它的版本更舊且沒有sameThreadExecutor()方法.

idea的用戶雙擊shift (eclipse的忘了什麼快捷鍵了), 輸入

com.google.common.util.concurrent.MoreExecutors

是不是看到了很多個相同包名的類, 而且他們分佈在不同的包裏面…
心累有木有
印證了上面的文字分析, 怎麼解決:

啓動terminal終端(idea/eclipse下面), 輸入命令:
(本人idea有毒, 沒法調起圖形化界面分析依賴, 只能用命令行了)

mvn dependency:tree

然後在命令行下面ctrl + f 搜索:guava, 會看到有不同版本的guava. 如下圖, 說明我們引入dubbo依賴的時候間接引入了guava的16.01版本(dubbo也依賴了guava)
在這裏插入圖片描述
找到你們的舊版本那個, 然後在pom文件裏面exclusions
在這裏插入圖片描述
然後再mvn dependency:tree 分析一下依賴樹. 講道理就只有一個com.google.common.util.concurrent.MoreExecutors 類了.(還有多個就將舊的都exclusion掉)

(如果有效, 點個贊哈.我看看幫助了多少人)

其實我遇到的是下面這個鬼故事:…
我遇到了上面的問題, 我按照上面的步驟走下來, 發現居然沒成功
(以前屢試不爽的方法居然失效了…)

但是問題的根源依舊是引入了多個相同包的類.
在這裏插入圖片描述
在這裏插入圖片描述
上面這個jar包是公司內打的jar包.
這個jar包使用shaded的方法將guava集成到裏面了. 然而relocation配置錯了.
在這裏插入圖片描述
com.google.guava包是不存在的… guava的包前綴應該是com.google.common.
如下圖纔是正確的:
在這裏插入圖片描述
找到問題根源了, 於是找到對應的研發讓他把pom文件的relocation修改一下重新打個包 . 解決了.

歡迎點贊或評論. 感謝.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章