使用mvn shade构建的MaxMind GeoIp依赖项jackson-databind中的NoSuchMethodException

时间:2016-01-23 01:17:49

标签: scala maven apache-spark jackson maxmind

我正在尝试在spark任务中运行MaxMind的geoIP,但是我从maxmind调用到jackson-databind库得到NoSuchMethodException。我已经使用mvn排除删除了所有其他版本的jackson-databind,但是在mvn clean之后错误仍然存​​在。我错过了什么?

没有依赖冲突:

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

错误:

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)

编辑:我有很多org.codehaus.jackson,我还需要排除这些吗?如何解决名称空间的差异?

编辑:这是内置在基于Scala的项目中,该项目在Apache Spark中运行。使用maven-shade-plugin 2.4

将jar编译成带阴影的jar

编辑: 这是阴影罐上jar tvf的完整输出: https://drive.google.com/file/d/0B2ZVKNsRXgTbeUdEU2ZhM2J3dmc/view?usp=sharing

这是jackson-databind的grep结果: 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

和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

初始化和查询maxmind GeoIP DB在测试中成功运行。该错误仅在作为spark任务运行时在生产中发生 - 在使用maven-shade打包后。

maven-shade插件配置:http://pastebin.com/QzrhM5Ee

阴影jar不包含jackson-databind jar,但jar中的所有* .class文件是否有意义?

3 个答案:

答案 0 :(得分:10)

ArrayNode jar版本2.2.0开始删除了以JsonNodeFactoryList<JsonNode>作为参数的com.fasterxml.jackson.core:jackson-databind构造函数的版本,所以这看起来像maxmind-db库中的一个错误,因为它引入了jackson-databind的2.7.0版本,但(至少间接地)调用了一个过时的方法。

如果可能,您可以尝试通过明确包含在您的pom文件中来降级jackson-databind依赖关系,如下所示:

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

答案 1 :(得分:3)

老实说,我无法使用<relocation> to the shaded jar configdowngrading jackson-databind,因此我最终只是降级com.maxmind.geoip2,这是{{3}的最新建议。这导致我来了,它有效!

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

答案 2 :(得分:2)

通过将以下重定位添加到着色jar配置中来解决此问题:

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