带有war文件的Maven上的Spring-boot jackson错误,但不是带有com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrd
Posted
技术标签:
【中文标题】带有war文件的Maven上的Spring-boot jackson错误,但不是带有com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z的jar文件【英文标题】:Spring-boot jackson error on Maven with war file, but not jar file with com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z 【发布时间】:2017-11-06 03:09:46 【问题描述】:Spring-boot 1.5.2 build with Maven to war 包有一个非常奇怪的问题,它与 Jackson 依赖项有错误,仅在 Ubuntu 16.04 上,因为我正在使用另一个 Centos 7,并且将应用程序作为 war 启动没有问题或 jar 文件。
用 Maven 构建到 jar 或 war 后,我可以运行构建的包
javar -jar target/project.war (or project.jar)
嵌入式 Tomcat 将启动。此外,war 包可以部署到 Centos 7 的 webapps 目录中的外部 Tomcat。对于 Ubuntu 16.04,我只能运行嵌入 Tomcat 的 .jar 文件,但不能运行嵌入 Tomcat/External 的 war 文件。
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter]: Factory method 'httpPutFormContentFilter' threw exception; nested exception is java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 26 more
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:564)
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:474)
at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:588)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.<init>(MappingJackson2HttpMessageConverter.java:57)
at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.<init>(AllEncompassingFormHttpMessageConverter.java:61)
at org.springframework.web.filter.HttpPutFormContentFilter.<init>(HttpPutFormContentFilter.java:63)
at org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter.<init>(OrderedHttpPutFormContentFilter.java:29)
at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.httpPutFormContentFilter(WebMvcAutoConfiguration.java:142)
这是 pom 文件 https://pastebin.com/13MwTm89,我只添加了来自 Jackson 的另一个依赖项,用于将 XML 反序列化为对象。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.8.7</version>
</dependency>
这是 Jackson 的完整依赖项
mvn dependency:tree | grep 'jackson'
[INFO] +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.8.7:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-core:jar:2.8.7:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.7:compile
[INFO] | +- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.8.7:compile
【问题讨论】:
你为什么用jackson-annotations:jar:2.8.0
而其余的都是2.8.7?
不是来自我,是来自 Spring-boot 依赖父级。
尝试降级您的版本。或者排除 spring 的依赖并添加正确的版本
检查war文件以确保添加了正确的版本。也检查tomcat。可能是它有自己的错误版本杰克逊库
com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()
自 2.3 以来一直是 Jackson 的一部分,因此您必须从 Ubuntu 系统的某个位置加载一个非常旧的版本。我将 Tomcat 配置为使用-verbose:class
启动 JVM。输出将告诉您从哪里加载 JsonFactory
。
【参考方案1】:
在尝试在 pom.xml 中单独注释掉每个依赖项后,我终于发现了问题,这是由于内部项目中非常旧版本的 fastxml 生成为 jar 文件,我包含在 main 的 pom.xml 中项目。
内部项目包含一些依赖项,我认为其中一个包含这个旧的 jackson-core 库,我认为是 grpc 或 protobuf。
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.0.0-beta-1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
不知何故,在 Ubuntu 16.04 中,Maven 3.3.9 更喜欢这个 jackson-core,而不是 Spring boot 的最新版本或直接在 pom.xml 中指定。
在带有 Maven 3.5.0 的 Centos 7 中,当它在 Jackson 上运行时不会发生这种情况,因为它使用了最新的依赖项。
【讨论】:
以上是关于带有war文件的Maven上的Spring-boot jackson错误,但不是带有com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrd的主要内容,如果未能解决你的问题,请参考以下文章
maven打war包后,excel文件乱码,其余纯文本文件都正常
请问maven工程jar包,war包,pom打包,都是怎么定的?