NoSuchMethodException in MaxMind GeoIp-Abhängigkeit jackson-databind mit mvn shade erstellt

8

Ich versuche MaxMinds GeoIP in einer Spark-Task auszuführen, aber ich bekomme eine NoSuchMethodException von einem Maxmind-Aufruf an eine Jackson-Databind-Bibliothek. Ich habe alle anderen Versionen von Jackson-Databind mit MVN Ausschlüsse entfernt, aber der Fehler bleibt nach einem Mvn sauber. Was vermisse ich?

Keine Abhängigkeitskonflikte:

mvn dependency:tree -Dverbose -Dincludes=com.fasterxml.jackson.core:jackson-databind ... [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ sift-etl --- [INFO] com.sift.etl:sift-etl:jar:0.1.6 [INFO] \- com.maxmind.geoip2:geoip2:jar:2.6.0:compile [INFO] \- com.maxmind.db:maxmind-db:jar:1.2.0:compile [INFO] \- com.fasterxml.jackson.core:jackson-databind:jar:2.7.0:compile

Fehler:

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V at com.maxmind.db.Decoder.decodeArray(Decoder.java:272)

Bearbeiten: Ich habe eine Tonne org.codehaus.jackson , muss ich diese auch ausschließen? Wie kann ich die Unterschiede in Namespaces auflösen?

Bearbeiten: Dies ist in ein scala-basiertes Projekt integriert, das in Apache Spark ausgeführt wird. Das Glas wird mit maven-shade-plugin 2.4 in ein schattiertes Glas kompiliert.

Bearbeiten: Hier ist die komplette Ausgabe für jar tvf im schattierten Glas: Ссылка

Hier ist das Ergebnis eines grep für jackson-databind: 0 Mon Jan 25 09:53:54 PST 2016 META-INF/maven/com.fasterxml.jackson.core/jackson-databind/ 151 Mon Jan 25 09:53:54 PST 2016 META-INF/maven/com.fasterxml.jackson.core/jackson-databind/pom.properties 5192 Mon Jan 25 09:53:54 PST 2016 META-INF/maven/com.fasterxml.jackson.core/jackson-databind/pom.xml

und ArrayNode: /usr/lib/jvm/sift-jdk1.8.0_66/bin/jar -tvf target/sift-etl-0.1.6-shaded.jar | grep ArrayNode 15060 Sat Jan 23 01:33:14 UTC 2016 shaded/parquet/org/codehaus/jackson/node/ArrayNode.class 1309 Sat Jan 23 01:33:18 UTC 2016 org/apache/lucene/index/DocumentsWriterDeleteQueue$QueryArrayNode.class 1645 Sat Jan 23 01:33:18 UTC 2016 org/apache/lucene/index/DocumentsWriterDeleteQueue$TermArrayNode.class 18145 Sat Jan 23 01:33:20 UTC 2016 com/fasterxml/jackson/databind/node/ArrayNode.class 1058 Sat Jan 23 01:33:22 UTC 2016 org/apache/commons/configuration/plist/XMLPropertyListConfiguration$ArrayNode.class

Die Initialisierung und Abfrage der maxmind GeoIP DB wird in Tests erfolgreich durchgeführt. Der Fehler tritt nur in der Produktion auf, wenn er als Spark-Task ausgeführt wird - nachdem er mit maven-shade verpackt wurde.

maven-shade Plugin-Konfiguration: Ссылка

Ist es sinnvoll, dass das schattierte Jar nicht das jackson-databind jar enthält, sondern alle * .class-Dateien im jar?

    
bhan 23.01.2016, 01:17
quelle

3 Antworten

2

Dies wurde behoben, indem die folgende Verschiebung zur schattierten jar-Konfiguration hinzugefügt wurde:

<relocation> <pattern>com.fasterxml.jackson.core</pattern> <shadedPattern>com.shaded.fasterxml.jackson.core</shadedPattern> </relocation>

    
bhan 26.01.2016, 20:26
quelle
10

Die Version des ArrayNode -Konstruktors, der die Parameter JsonNodeFactory und List<JsonNode> als Parameter verwendet, wurde ab Version 2.2.0 von com.fasterxml.jackson.core:jackson-databind jar entfernt, sodass dies wie ein Fehler in der maxmind-db -Bibliothek aussieht , da es die Version 2.7.0 von jackson-databind aufruft, aber (zumindest indirekt) eine veraltete Methode aufruft.

Wenn möglich, könnten Sie versuchen, Ihre jackson-databind -Abhängigkeit herabzusetzen, indem Sie dies explizit in Ihre Pom-Datei aufnehmen:

%Vor%     
palimpsestor 23.01.2016 02:54
quelle
0

Ehrlich gesagt, ich konnte das nicht mit der <relocation> auf die schattierte Jar-Konfiguration oder von downgrade jackson-databind , also habe ich am Ende nur com.maxmind.geoip2 heruntergestuft, wie es der letzte Vorschlag aus dem Github-Thread , der mich hierher geführt hat, und es hat funktioniert!

%Vor%     
Mr. Kevin Thomas 24.10.2017 23:26
quelle