Ich benutze hadoop-2.7.2
und ich habe einen MapReduceJob mit IntelliJ gemacht. In meinem Job benutze ich apache.commons.cli-1.3.1
und ich legte die lib in das Glas.
Wenn ich MapReduceJob in meinem Hadoop-Cluster verwende, habe ich einen NoSuchMethodError
:
Ausnahme im Thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder (Ljava / lang / String;) Lorg / apache / commons / cli / Option $ Builder;
Ich verstehe nicht, weil die Methode in der Klasse vorhanden ist Option
und die Klasse Option
wird aus dem extrahiert commons-cli.jar
zu meinem Bewerbungsglas. Außerdem habe ich dieses Problem bei meinen anderen Bibliotheken nicht.
Vielen Dank für Ihre Zeit.
Antworten:
1 für die Antwort № 1Das Problem scheint damit zu zusammenhängen, wie die classloader
lädt die Klassen. Weil der static Builder class
war in common-cli 1.4
, während einige der hadoop
Abhängigkeiten verweisen immer noch auf ältere Versionen - das Problem ist aufgetreten.
In meinem Fall wurde das Problem durch Ändern derReihenfolge des Hinzufügens der JAR-Datei in den Klassenpfad im Shell-Skript, das für die Einrichtung der Umgebung vor der Programmausführung verantwortlich ist. Früher habe ich das Glas wie in Classpath hinzugefügt
CLASSPATH=<Hadoop Jars>:<Common CLI jar>:$CLASSPATH
wird geändert in
CLASSPATH=<Common CLI jar>:<Hadoop Jars>:$CLASSPATH
und das Problem wurde behoben.
0 für die Antwort № 2
Wir haben dieses Problem mit der nächsten Gradle-Konfiguration behoben:
compile("org.apache.parquet:parquet-tools:1.9.0"){
exclude module:"commons-cli"
}
0 für die Antwort № 3
Wir konnten diesen Fehler mit beheben Umzüge der Maven-Klasse. Wenn Sie das Schatten-Plugin verwenden, um Ihr Glas zu erstellen, fügen Sie unter dem entsprechenden Abschnitt Folgendes zu pom.xml hinzu:
<!-- 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>
Auch ein expliziter Verweis auf v1.3+ von commons-cli müssen am Anfang des Abschnitts "Abhängigkeiten" hinzugefügt werden, bevor Abhängigkeiten auftreten, die einen transitiven Verweis auf eine ältere Version von commons-cli enthalten.