【发布时间】:2015-07-27 15:48:27
【问题描述】:
我正在尝试在我的 Maven 托管 Spring Web 应用程序中将 Jackson 从 1.9.2 升级到 2.5.4。这一切都只是花花公子,但在我们有一个 Windows azure 集成的一个不起眼的角落里爆炸了。
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 更改为 @987654325 @。当我将依赖项切换到运行时范围时,错误消失了,但是我们的 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>
为什么 mvn 不能处理这种情况?最好的补救方法是什么?
【问题讨论】:
标签: java spring maven azure jackson