2016-07-29 214 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 

,它解決了這一問題。

相關問題