遇到下面這個異常, 很抓雞有木有…
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修改一下重新打個包 . 解決了.
歡迎點贊或評論. 感謝.