当前位置: 首页 > 面试题库 >

Jackson Databind类路径问题

司徒瀚
2023-03-14
问题内容

我有一个Spring Boot应用程序,当我在本地使用“ mvn clean
install”进行部署时,它运行良好,但是当通过Jenkin产生战争时,它会引发以下错误。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectMapper' defined in class path resource [com/test/common/TestRestConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.databind.ObjectMapper]: Factory method 'objectMapper' threw exception; nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
        ... 62 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.databind.ObjectMapper]: Factory method 'objectMapper' threw exception; nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
        ... 74 common frames omitted
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
        at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:535)
        at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:452)

我只是尝试使用超越比较来比较2个war文件,而且除了用于编译的JDK次要版本外,我看不到任何差异。

我试图在我的本地版本和jenkin版本中搜索SerializationConfig.class,

以下命令的输出是:

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep SerializationConfig.class &&  echo {}'

局部战争O / P:-

com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar

詹金战争O / P:-

com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar

基本上,我将ObjectMapper注入到我的TestRestConfiguration类中,如下所示:

@Inject
    private ObjectMapper objectMapper;

不确定,为什么通过Jenkin生成war文件会引起问题。

任何帮助,将不胜感激。


问题答案:

您似乎正在从两个不同的jar文件依赖项中提取同一类(SerializationConfig)。根据您的问题,很明显,可以在jackson-
databind-2.7.3.jar或jersey-
all-2.18.jar中找到com.fasterxml.jackson.databind(在堆栈跟踪中引用)中的一个。 :

com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar

我首先尝试减少对您的依赖,以便您依赖jackson-databind-2.7.3.jar或jersey-
all-2.18.jar,但不能同时依赖于两者。如果您的应用程序可以与另一个应用程序一起使用,我怀疑这可以解决您的问题(尽管我承认我可能已经期望看到Spring的“未定义类型的唯一bean”消息,但我没有注意到它。在您的帖子中)。

无论如何,如果我是对的,那么您所看到的是在本地环境中发生的类加载工件与在Jenkins生成的工件中以及部署在您的服务器上所发生的事情有所不同(这里的附加复杂性–您可能想要仔细检查您的服务器是否提供了任何库,并准确了解您的类加载发生的顺序-
我知道这很有趣。

偷看Jackson的SerializationConfig类的源代码,我发现以下内容,如果两个不同的jar文件中的类实际上并不相同,则可能会使事情变得有趣。

private static final long serialVersionUID = 1

希望能帮助到你。祝好运!

编辑1:

设置一对通过Tomcat或Jetty之类的嵌入式服务器生成所谓的“胖罐”文件的构建可能很有趣。如果将本地生产的产品与詹金斯生产的产品的行为进行比较,您可能会从中学到一些东西。你看到同样的问题吗?使用胖子jar文件,与将其部署到现有(且预先配置的,可变的)容器中相比,您对部署的环境具有更明确的控制。

编辑2:

您可能需要做的几件事有助于弄清您的环境差异。

mvn dependency:tree

或者,如果您有足够的耐心

mvn -X


 类似资料:
  • 问题内容: 我有两节课: MyApplication 库 该库已被编译为Library.class,并且源代码不再可用。我现在正在尝试从源代码编译MyApplication。MyApplication取决于库。该库的软件包名称为org.myCompany。我尝试将我的类路径设置为以下内容: 产生以下javac编译器错误消息: 所以我将类路径更改为: 产生完全相同的错误消息。 如何设置Windows

  • 问题内容: 我一直在尝试运行一个jar文件-我们称它为test.jar-在Unix系统上使用Sybase jconn3.jar。 我创建了一个具有以下内容的MANIFEST.MF文件: 这给出了ClassNotFoundError。$ SYBASE是指向/ opt / sybase13的系统变量;我还尝试了以下方法: 和 但是,如果我将jconn3.jar文件从$ SYBASE / jConnec

  • 我在hadoop作业中看到了这一点: 这个问题看起来与这个问题类似,只是我没有在我的类路径上提供任何jax-b依赖项。然而,它看起来确实像hadoop。 有没有办法强迫hadoop使用jdk jaxb JAR,或者只使用它自己提供的jaxb JAR,而不是两者混合使用?

  • 这个问题并不是指在整个集群中分发jar供工作人员使用。 它指的是在客户端机器上指定一些额外的库。更具体地说:我试图运行以下命令来检索序列文件的内容: 它抛给我这个错误: 我有一个名为DoubleArrayWritable的可写类。事实上,在另一台计算机上,一切都运行良好。 我试图设置以包含包含该类的jar,但没有结果。实际上,跑步时: 结果不包含我添加到HADOOP_类路径中的jar。 问题是:如

  • 我在设置Java开发环境时遇到了一个问题。在过去,我安装了Java,然后安装了IDE,然后开始编写代码。我现在开始设置我的笔记本电脑,使用命令行编译和记事本作为我的代码编辑器。这是我第一次尝试纠正错误。 我运行javac,它创建了我的。类文件没有问题,但是我尝试用java A运行类文件,它抛出了一个错误: c:\工作区 我的类路径设置为C:\Program Files\Java\jdk-14.0.

  • 我是一名新的程序员,正在学习Java入门课程。我的操作系统是Windows 10。大约4-5个月前,我们最初设置了类路径,从命令行运行了我们的“Hello World”程序,然后再也没有使用过它。 现在我们正在做一个输入/输出重定向到文件的练习,我必须忘记我的类路径是什么,所以我试图重新设置它。 我已经使用以下命令设置了我的类路径: 然后我尝试运行我的程序,它位于目录C:\Users\grant\