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

文章目录

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

1. 复现错误


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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第1张图片

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

2. 分析错误


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

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

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第2张图片

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

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第3张图片

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第4张图片

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

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

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第5张图片

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

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

3. 解决错误


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

<dependency>
    <groupId>com.google.guavagroupId>
    <artifactId>guavaartifactId>
    <version>19.0version>
dependency>

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第6张图片

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

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

<dependency>
    <groupId>org.apache.hadoopgroupId>
    <artifactId>hadoop-commonartifactId>
    <version>2.7.3version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guavagroupId>
            <artifactId>guavaartifactId>
        exclusion>
    exclusions>
dependency>

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第7张图片

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

解决java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor的错误_第8张图片

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,开发语言,后端,java-ee,hive,guava)