我试图在我的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>
为什么不能处理这种情况?什么是补救它的最佳方法?
答案 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.xml和http://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队列接收消息,没有任何错误。
如有任何疑虑,请随时告诉我。
答案 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。