解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误

编程入门 行业动态 更新时间:2024-10-08 12:38:35

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的<a href=https://www.elefans.com/category/jswz/34/1771449.html style=错误"/>

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误

文章目录

  • 1. 复现错误
  • 2. 分析错误
  • 3. 解决错误
  • 4. 重要补充
    • 4.1 maven中pom依赖相同jar包优先顺序加载版本
    • 4.2 名词解释

1. 复现错误


今天在连接hive数据库时,却报出如下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.googlemon.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;

2. 分析错误


错误信息的意思是:在com.googlemon.util.concurrent.MoreExecutors类中,没有找到sameThreadExecutor的方法。

别着急,我们再看 at org.apache.curator.framework.listen.ListenerContainer.addListener(ListenerContainer.java:40) 这句话,他说错误信息在ListenerContainer类的第40行。

我们点击控制台,进入到ListenerContainer类的第40行的位置,如下图所示:

由上图可知,此处的sameThreadExecutor是红色,说明类MoreExecutors中确实没有sameThreadExecutor方法,那怎么办呢?

我们点击进如MoreExecutorsl类中,查看首行的注释,如下图所示:

由上图可知,MoreExecutors类在Guava中,于是检查pom.xml文件,如下图所示:

由上图可知,确实没有guava依赖包。

【备注】:上图可视化界面是idea中的Maven Helper插件。更多idea的插件,可访问链接:idea常用且好用的十几个插件。

既然没有guava依赖包,为什么会引入guava包中的类呢?我们在上图文本框中输入guava,如下图所示:

你会看到hadoop-common,hive-exec,hive-jdbc的包都有引入了guava包,且引入的guava包的版本不一样。

因而,我们不能使用hadoop-common,hive-exec,hive-jdbc包中引入的guava包,而是使用我们自己的guava包。

3. 解决错误


因而,我们在pom.xml中引入如下包:

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

当然,你可以剔除hadoop-common,hive-exec,hive-jdbc的包中引入的guava包,也可以保留。

比如,我想剔除hadoop-common包中引入的guava包,如下代码所示:

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.3</version><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions>
</dependency>

如是修改后,重新启动,没有出现这个错误:

此时,我们再进入到ListenerContainer类的第40行的位置,发现不再报错,如下图所示:

4. 重要补充


为什么在pom.xml中引入了guava包,同时,没有剔除hadoop-common,hive-exec,hive-jdbc的包中的guava包,依然能够成功运行呢?

我们就需要考虑:mavenpom依赖相同jar包优先顺序加载版本。

4.1 maven中pom依赖相同jar包优先顺序加载版本


当依赖一个jar包多个版本时,优先使用哪个版本,原则如下:

  1. 本级优先于上级,上级优先于下级

  2. 本级依赖版本优先于管理版本

  3. 同一个包中后加载的版本覆盖先加载的版本

  4. 上级管理版本和本级管理版本会覆盖下级依赖版本

  5. 不同下级jar中依赖了不同版本,优先使用先加载下级jar中的版本

  6. 与版本号大小没有关系

  7. 本级无法使用下级管理版本

4.2 名词解释

  1. 依赖版本:指dependencies中直接依赖

  2. 管理版本:指dependencyManagement中管理的版本

  3. 本级:指当前工程

  4. 上级:指parent依赖的jar

  5. 下级:指本级引用的jar

更多推荐

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.s

本文发布于:2024-02-07 04:31:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1753231.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误   NoSuchMethodError   google   java   lang

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!