hadoop nosuchmethoderror apache.commons.cli

zf9nrax1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(550)

我在用 hadoop-2.7.2 我和intellij做了一个mapreducejob。在我的工作中,我用 apache.commons.cli-1.3.1 我把lib放进jar里。
当我在hadoop集群上使用mapreducejob时,我有一个 NoSuchMethodError :
线程“main”java.lang.nosuchmethoderror中出现异常:org.apache.commons.cli.option.builder(ljava/lang/string;)lorg/apache/commons/cli/选项$builder;
我不明白,因为类中存在方法 Option 还有班级 Option 是从 commons-cli.jar 到我的应用程序jar。而且,我和其他库没有这个问题。
谢谢你抽出时间。

gkn4icbw

gkn4icbw1#

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

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

1cosmwyk2#

我们可以使用maven类重新定位来修复这个错误。如果您使用shade插件构建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>

此外,需要在依赖项部分的顶部添加对commons cli v1.3+的显式引用,然后再添加对commons cli旧版本的可传递引用的任何依赖项。

7uhlpewt

7uhlpewt3#

问题似乎与 classloader 正在加载类。因为 static Builder classcommon-cli 1.4 ,而一些 hadoop 依赖项仍然引用旧版本-出现问题。
在我的例子中,通过将jar文件的添加顺序更改为负责在程序执行之前设置环境的shell脚本中的类路径,问题得到了解决。之前,我将jar添加到类路径中,比如

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

已更改为

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

它解决了这个问题。

相关问题