2016-07-29 212 views
2

我使用hadoop-2.7.2,我用IntelliJ做了MapReduceJob。在我的工作中,我使用了apache.commons.cli-1.3.1,并将该lib放入jar中。Hadoop NoSuchMethodError apache.commons.cli

当我使用MapReduceJob我的Hadoop集群上我有一个NoSuchMethodError

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder;

我不明白,因为该方法在类Option存在和类Optioncommons-cli.jar提取到我的应用程序罐。此外,我没有与我的其他图书馆有这个问题。

谢谢你的时间。

+0

我刚刚发现hadoop使用commons-CLi 1.2。我认为这是我的问题的来源,但我不知道如何解决它。 – Antonin

+0

你可以尝试在你的'pom.xml'中从'Hadoop依赖'中排除'commons-cli-1.2',然后Hadoop将使用你的'commons-cli-1.3.1'。如果它导致任何错误,你最好在你的代码中使用'1.2'。 –

+0

我做了这样的事情,但我的老板不想这样,因为它不能解决问题。如果我们稍后与另一个lib有相同的问题,他不想再次解决问题。 但是,谢谢你的建议。 – Antonin

回答

0

我们解决了这个问题,下一个gradle这个配置:

compile('org.apache.parquet:parquet-tools:1.9.0'){ 
    exclude module:"commons-cli" 
} 
0

我们能够修复使用maven class relocations此错误。如果您使用的是遮阳插件来构建你的jar添加以下在适当部分的pom.xml:

<!-- necessary to fix NoSuchMethodError: org.apache.commons.cli.Option.builder --> 
          <relocations> 
           <relocation> 
            <pattern>org.apache.commons.cli</pattern> 
            <shadedPattern>org.shaded.commons.cli</shadedPattern> 
           </relocation> 
          </relocations> 

还明确提到的V1.3 +公地CLI需要在的顶部添加依赖关系部分之前的任何依赖关系,可能有一个传递引用旧版本的commons-cli。

1

该问题似乎与classloader如何加载类有关。因为static Builder classcommon-cli 1.4,而一些hadoop依赖关系仍然指旧版本 - 发生问题。

在我的情况下,问题通过将jar文件添加到shell脚本中的classpath中的顺序来解决,该脚本负责在程序执行前设置环境。此前,我添加的jar文件放进classpath中像

CLASSPATH=<Hadoop Jars>:<Common CLI jar>:$CLASSPATH 

改为

CLASSPATH=<Common CLI jar>:<Hadoop Jars>:$CLASSPATH 

,它解决了这一问题。

相关问题