2016-01-23 10 views
8

Sto provando a eseguire il geoIP di MaxMind in un'attività spark, ma ricevo un NoSuchMethodException da una chiamata maxmind a una libreria databind di jackson. Ho rimosso tutte le altre versioni di jackson-databind usando le esclusioni di mvn, tuttavia l'errore persiste dopo un mvn clean. Cosa mi manca?NoSuchMethodException in MaxMind GeoIp dependency jackson-databind creato con ombreggiatura mvn

Nessun conflitto di dipendenza:

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

Errore:

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)

Edit: ho un sacco di org.codehaus.jackson, ho bisogno di escludere questi pure? Come posso risolvere le differenze in namespace?

Modifica: questo è integrato in un progetto basato su scala eseguito in Apache Spark. Il vaso viene compilato in un barattolo ombreggiata con Maven-ombra-plugin 2.4

Edit: Ecco l'output completo per vaso tvf sul vaso ombreggiato: https://drive.google.com/file/d/0B2ZVKNsRXgTbeUdEU2ZhM2J3dmc/view?usp=sharing

Ecco il risultato di un grep per 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

e 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

inizializzazione e l'interrogazione del MaxMind GeoIP DB viene eseguito con successo nei test. L'errore si verifica solo in produzione quando viene eseguito come attività scintilla, dopo che è stato impacchettato con maven-shade.

Maven-ombra plug-config: http://pastebin.com/QzrhM5Ee

E 'significativo che il vaso ombreggiata non contiene il vaso Jackson-DataBind, ma tutti i file * .class entro il vaso?

+0

Il problema sembra essere correlato alla versione di 'jackson-databind' in' spark-assembly.jar'. Qui la mia traccia _-verbose_: '[Loaded org.apache.spark.TaskContextImpl $$ anonfun $ markTaskCompleted $ 1 dal file: /home/vagrant/spark-1.6.1-bin-hadoop2.6/lib/spark-assembly-1.6.1-hadoop2.6.0.jar] ' – Stan

risposta

2

Questo è stato risolto aggiungendo il seguente trasferimento alla configurazione barattolo ombreggiato:

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

+0

Sto affrontando lo stesso problema mentre provavo a usare Maxmind GeoIP2 con Spark - Scala. Potresti elaborare un po 'la tua soluzione? Hai ricompilato Spark con la configurazione di schermo sopra o è qualcos'altro? –

10

La versione del costruttore ArrayNode che prende un JsonNodeFactory e List<JsonNode> come parametri è stato rimosso dalla versione 2.2.0 di com.fasterxml.jackson.core:jackson-databind vaso, in modo da questo appare come un bug nella libreria maxmind-db, dal momento che sta tirando in versione 2.7. 0 di jackson-databind ma (almeno indirettamente) chiamando un metodo obsoleto.

Se possibile, si potrebbe provare il downgrade del jackson-databind dipendenza includendo in modo esplicito nel file pom in questo modo:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.1.0</version> 
</dependency> 
+1

Mi sembra che questo è stato [aggiunto in 2.7.0] (https://github.com/FasterXML/jackson-databind/commit/12e811240e7f492a7a0639730c59c4a0cac10578#diff-ff1cff3f8cbf4dab0ac0fdd2435b1b87R36). –

+0

Sono corretto. Immagino che il costruttore sia * re * aggiunto in 2.7.0, poiché era [esistente in 2.1.0 e poi scomparso in 2.2.0] (http://grepcode.com/file_/repo1.maven.org/maven2/ com.fasterxml.jackson.core/jackson-databind/2.2.0/com/fasterxml/Jackson/databind/node/ArrayNode.java /? v = diff & id2 = 2.1.0). – palimpsestor

+0

Dato che, nonostante la dipendenza di tipo maven, quella versione di 'jackson-databind' non si trova nel classpath di qualunque programma di caricamento di classe sta eseguendo il codice in questione. – palimpsestor

0

Onestamente, non ho potuto ottenere questo lavoro con il <relocation> to the shaded jar config o da downgrading jackson-databind, quindi ho finito per il downgrade solo com.maxmind.geoip2 come è stato il l ottimo suggerimento dallo Github issue thread che mi ha portato qui, e ha funzionato!

<!-- Using an old version b/c https://github.com/maxmind/GeoIP2-java/issues/57 --> 
<dependency> 
    <groupId>com.maxmind.geoip2</groupId> 
    <artifactId>geoip2</artifactId> 
    <version>2.5.0</version> 
</dependency> 
Problemi correlati