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修改一下重新打个包 . 解决了.

欢迎点赞或评论. 感谢.

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