升级杰克逊maven依赖问题

时间:2015-07-27 15:48:28

标签: java spring maven azure jackson

我试图在我的maven管理的Spring网络应用中将Jackson从1.9.2升级到2.5.4。这一切都只是花花公子,但在一个不起眼的角落爆炸,我们有一个窗口天蓝色的整合。

(我相信)pom.xml的相关部分是:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.5.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.5.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>2.5.4</version>
    </dependency>

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus</artifactId>
        <version>0.7.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-storage</artifactId>
        <version>2.1.0</version>
        <scope>runtime</scope>
    </dependency>

运行时的异常是:

java.lang.NoClassDefFoundError: org/codehaus/jackson/annotate/JsonUnwrapped
        at org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector.shouldUnwrapProperty(JacksonAnnotationIntrospector.java:153) ~[jackson-mapper-asl-
1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.BeanDeserializer._resolveUnwrappedProperty(BeanDeserializer.java:515) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:384) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:438) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:383) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:321) ~[jackson-mapper-asl-1.9.2
.jar:1.9.2]
        at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:167) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:188) ~[jackson-mapper-asl-1.9.2.jar:1
.9.2]
        at org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2820) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2719) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1926) ~[jackson-mapper-asl-1.9.2.jar:1.9.2]
        at com.microsoft.windowsazure.services.servicebus.implementation.BrokerPropertiesMapper.fromString(BrokerPropertiesMapper.java:37) ~[azure-servicebus-0
.7.0.jar:na]
        at com.microsoft.windowsazure.services.servicebus.implementation.ServiceBusRestProxy.receiveMessage(ServiceBusRestProxy.java:259) ~[azure-servicebus-0.
7.0.jar:na]
        at com.microsoft.windowsazure.services.servicebus.implementation.ServiceBusRestProxy.receiveQueueMessage(ServiceBusRestProxy.java:216) ~[azure-serviceb
us-0.7.0.jar:na]
        at com.microsoft.windowsazure.services.servicebus.implementation.ServiceBusExceptionProcessor.receiveQueueMessage(ServiceBusExceptionProcessor.java:137
) ~[azure-servicebus-0.7.0.jar:na]

我不了解的很大一部分原因是为什么Maven不能简单地为Azure提供正确的依赖 - 它在技术上并不是一个依赖性收敛问题,因为groupId和所有东西都有已从org.codehaus更改为com.fasterxml。当我将依赖关系切换到运行时范围时,错误消失了,但是我们的IDE抱怨依赖关系不可用,这是令人望而却步的。

我已尝试明确包含旧版本,但错误并未发生。

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

我也试过排除:

    <!-- Honeywell: AZURE -->
    <!-- Don't let it pull in old jackson -->
    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-servicebus</artifactId>
      <version>0.7.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-jaxrs</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-xc</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-storage</artifactId>
        <version>2.1.0</version>
        <exclusions>
          <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-jaxrs</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-xc</artifactId>
          </exclusion>
        </exclusions>
    </dependency>

为什么不能处理这种情况?什么是补救它的最佳方法?

3 个答案:

答案 0 :(得分:2)

如果查看抛出异常的类BrokerPropertiesMapper的源代码,您会看到它使用了com.codehaus版本的Jackson类。如果检查包含此类的Maven模块的依赖关系树,则可以看到Jackson 1.9.2 JAR继承自jersey-json依赖关系。

由于Azure Service Bus明确依赖于Jackson 1.9.2 JAR,因此在运行时类路径中需要1.9.x JAR,因为1.9.x和2.x之间的包结构不同。

您还将看到Azure SDK项目的master分支仍然明确依赖于Jackson 1.9.2。您可以在项目的Github问题跟踪器中提交问题以解决此问题。但是,目前你仍然坚持将Jackson 1.9.2保留在运行时类路径上。如果您自己的代码直接使用Jackson,您应该能够将2.x和1.9.x JAR添加到您的项目中,您的代码使用2.x版本的Jackson类,而第三方库使用1.9.x版本

答案 1 :(得分:1)

根据我的经验,Azure Service Bus使用Jersey-Json,其最新版本依赖于Jackson 1.9.2 jar。您可以在此处查看以下详细信息:https://github.com/Azure/azure-sdk-for-java/blob/master/serviceBus/pom.xmlhttp://mvnrepository.com/artifact/com.sun.jersey/jersey-json/1.19

虽然您需要在Spring WebApp中使用Jackson 2.5.4,但它与Azure使用的Jackson版本并不冲突,因为它们具有不同的完整包名称。因此,要使用maven管理Java包依赖,您只需要找出azure包信息,maven将自动安装azure依赖包,例如Jackson的旧版本包。

当我尝试使用Eclipse项目中的第一个pom.xml重现故障并运行maven install命令时,已经安装了Jackson 1.9.2 jar。我运行我的程序发送&amp;通过Azure servicebus队列接收消息,没有任何错误。

这是我的带有maven的Eclipse项目的包列表。 enter image description here

如有任何疑虑,请随时告诉我。

答案 2 :(得分:0)

尽量保持更快的xx杰克逊版本

codehaus是杰克逊的旧版本。

例如在我的情况下,我使用了documentdb,并且我从azure deps中排除了jackson(asl)依赖(依赖于旧的jackson codehaus版本)。

<exclude>

使用eclipse(pom.xml)编辑器的依赖关系管理视图可以帮助检查依赖关系冲突并使用onClick="window.open(\'http://website1.com/another-post/\');

进行修复

编辑:即使这不能解决您的问题,我也会通过示例完成答案;也许这可以帮助其他Azure / Jackson用户的类似问题。我不确定,但我认为jar冲突可能导致NoClassDefFound。