开发者社区 问答 正文

linux上 com.fasterxml.jackson.databind jar包使用报错

在centos7的服务器上部署springboot项目打包后的jar包,无法运行。 报错信息如下

2020-08-18 21:42:54.974 ERROR 1214 --- [           main] o.s.b.web.embedded.tomcat.TomcatStarter  : Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'formContentFilter' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.filter.OrderedFormContentFilter]: Factory method 'formContentFilter' threw exception; nested exception is java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.Module.getTypeId()Ljava/lang/Object;

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable(Jackson2ObjectMapperBuilder.java:796)

The following method did not exist:

    com.fasterxml.jackson.databind.Module.getTypeId()Ljava/lang/Object;

The method's class, com.fasterxml.jackson.databind.Module, is available from the following locations:

    jar:file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/lib/ext/jackson-databind-2.2.3.jar!/com/fasterxml/jackson/databind/Module.class
    jar:file:/root/springboot2-2.0.0.jar!/BOOT-INF/lib/jackson-databind-2.11.2.jar!/com/fasterxml/jackson/databind/Module.class

The class hierarchy was loaded from the following locations:

    com.fasterxml.jackson.databind.Module: file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/lib/ext/jackson-databind-2.2.3.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of com.fasterxml.jackson.databind.Module

com.fasterxml.jackson.databind包是由springboot的基础包导入的,所有jackson的包均为2.11.2版本。在测试中,仅仅简单的使用objectmapper对字符串进行json格式化这一操作。

@Controller
public class TestController {

    ConstantTypeDaoImpl constantTypeDao = new ConstantTypeDaoImpl();
    ObjectMapper mapper = new ObjectMapper();

    @RequestMapping(value = "/test")
    @ResponseBody
    public String test1() throws JsonProcessingException {
        List<ConstantType> constantTypes = constantTypeDao.getAll();
        return mapper.writeValueAsString(constantTypes);
    }
}

windows本地运行正常,但当在linux运行时便报错。望大佬能够指点迷津。

展开
收起
游客7s7r6y5wc7seg 2020-08-21 19:26:47 2157 分享 版权
阿里云 AI 助理回答

根据你提供的错误信息,问题在于你的应用在CentOS 7服务器上运行时遇到了java.lang.NoSuchMethodError,这通常意味着存在类路径冲突,即有多个版本的com.fasterxml.jackson.databind.Module类被加载。错误信息中明确指出,Spring Boot尝试调用的方法com.fasterxml.jackson.databind.Module.getTypeId()在实际加载的类中不存在。

解决这个问题的关键是确保你的应用只使用一个版本的Jackson库,特别是jackson-databind。从错误信息来看,系统类路径(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/lib/ext/jackson-databind-2.2.3.jar)和你的应用内部的依赖(BOOT-INF/lib/jackson-databind-2.11.2.jar)都包含了jackson-databind,且版本不同,导致了冲突。

解决方案:

  1. 移除系统级的Jackson库:检查并移除或禁用系统类路径中的jackson-databind-2.2.3.jar。这个库可能是因为某些原因被安装到了JRE的扩展目录下,这不是一个标准做法,应该避免。你可以通过删除该文件或者调整JVM启动参数来排除它。

  2. 统一应用内依赖版本:确认你的pom.xmlbuild.gradle文件中所有与Jackson相关的依赖(包括jackson-core, jackson-databind, jackson-annotations等)都指定了相同的版本号,比如2.11.2。可以使用dependency management功能来帮助管理这些依赖,确保它们的一致性。

  3. 清理并重新构建项目:在做了上述更改后,确保清空旧的构建产物,包括.m2目录下的相关依赖(对于Maven用户),或.gradle/caches(对于Gradle用户),然后重新构建你的应用。

  4. 使用命令行工具验证依赖:使用Maven的dependency:tree命令或Gradle的dependencies任务来查看项目的依赖树,确认没有其他间接依赖引入了不同版本的Jackson库。

  5. 打包时排除系统范围内的依赖:如果你发现无法直接移除系统级的Jackson库,考虑在构建时通过配置来排除这些外部干扰。例如,在Maven中,你可以在特定依赖声明中使用<scope>system</scope>并设置<systemPath>来指定本地路径,但更推荐的是完全避免使用系统范围的依赖,并在打包时使用<exclusions>标签排除不需要的传递依赖。

执行以上步骤后,重新部署你的Spring Boot应用到CentOS服务器,问题应该能够得到解决。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答