2016-07-29 13 views
2

私はhadoop-2.7.2を使用しており、IntelliJでMapReduceJobを行っています。私の仕事では、私はapache.commons.cli-1.3.1を使用しています。私はその瓶を瓶に入れました。私は私のHadoopクラスタ上MapReduceJobを使用する場合Hadoop NoSuchMethodError apache.commons.cli

は私が持っているNoSuchMethodError

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

メソッドがクラスOptionに存在し、クラスOptionが自分のアプリケーションにcommons-cli.jarから抽出されたので、私は理解していません瓶。さらに、私は他のライブラリでこの問題を抱えていません。

ありがとうございます。

+0

私はちょうどそのハーフープ使用のコモンズ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を使用してこのエラーを修正することができました。あなたは適切なセクションの下のpom.xmlには、以下の追加のjarを構築するために日陰のプラグインを使用している場合:

<!-- 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> 

またコモンズ-CLIのバージョン1.3 +への明示的な言及はのTOPに追加する必要があります以前のバージョンのcommons-cliへの推移的な参照を持つ可能性のある依存関係の前に、依存関係のセクションを作成します。

1

この問題は、classloaderがどのようにクラスをロードしているかに関係しているようです。 static Builder classcommon-cli 1.4にあったため、hadoopの依存関係の一部が依然として古いバージョンを参照していましたが、問題が発生しました。

私の場合、プログラムの実行前に環境設定を担当するシェルスクリプトのjarファイルの追加順序をクラスパスに変更することで問題は解決しました。以前、私は

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

のようにクラスパスにjarファイルを追加したが

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

に変更され、それが問題を修正しました。

関連する問題