【问题标题】:Jackson Databind classpath issue杰克逊数据绑定类路径问题
【发布时间】:2017-01-18 01:15:24
【问题描述】:

我有一个 spring boot 应用程序,当我在本地使用“mvn clean install”进行部署时工作正常,但是当通过 Jenkins 生成战争时,它会引发以下错误。

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)

我只是尝试使用 Beyond compare 比较 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

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

@Inject
    private ObjectMapper objectMapper;

不确定,为什么通过 Jenkins 生成的 war 文件会导致问题。

我们将不胜感激。

【问题讨论】:

    标签: java maven jenkins


    【解决方案1】:

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

    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 类的 source code,我发现以下内容,如果两个不同 jar 文件中的类实际上并不相同,这可能会使事情变得有趣..

    private static final long serialVersionUID = 1
    

    希望对您有所帮助。祝你好运!

    编辑 1:

    使用一些嵌入式服务器(如 Tomcat 或 Jetty)设置一对生成所谓的“胖 jar”文件的构建可能会很有趣。如果您比较您在本地生产的产品与在 Jenkins 上生产的产品的行为,您可能会从中学到一些东西。你看到同样的问题吗?使用 fat jar 文件,与部署到现有(预配置的、可更改的)容器中相比,您可以更明确地控制已部署的环境。

    编辑 2:

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

    mvn dependency:tree
    

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

    mvn -X
    

    【讨论】:

    • 如果您想查看有关依赖项的更多信息以及为什么跳过或包含特定依赖项,请添加详细标志:mvn dependency:tree -Dverbose
    【解决方案2】:

    您确定 Jenkins 会清理构建,即它调用 "mvn clean install" 而不仅仅是 "mvn install" 吗?一旦我在本地使用“mvn clean install”,异常就消失了,应用程序成功启动。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.4</version>
        </dependency>
    
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.7.4</version>
        </dependency>
    
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.7.4</version>
        </dependency>
    

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2020-12-24
      • 2019-04-16
      • 2015-08-19
      • 2023-03-05
      • 2019-04-27
      相关资源
      最近更新 更多