带有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程序集插件创建WAR文件

创建多个war文件并用Maven重命名它们

请问maven工程jar包,war包,pom打包,都是怎么定的?

maven打war包的时候如何设置不把web-inf下 lib文件夹的jar打包进去

如何将maven项目版本放入war文件清单中?