2016-09-09 1 views
8

Ich habe eine Spring-Boot-App, die gut funktioniert, wenn ich die Bereitstellung mit "mvn clean install" in meinem lokalen, aber wenn der Krieg durch Jenkin erzeugt wird, wird es den folgenden Fehler werfen.Jackson Databind Classpath Problem

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) 

Ich habe gerade versucht, die darüber hinaus mit 2 IST-Dateien zu vergleichen vergleichen, und ich sehe nicht, jede diff mit Ausnahme der JDK Minor-Version zu kompilieren, verwendet wird.

Ich habe versucht, für die SerializationConfig.class in meinem lokalen bauen und in der jenkin Build zu suchen,

Der Ausgang für den folgenden Befehl,

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

Lokale Krieg 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 

Jenkin Krieg 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 
Grundsätzlich 0

, spritze ich die ObjectMapper in meiner TestRestConfiguration Klasse wie folgt

@Inject 
    private ObjectMapper objectMapper; 

Nicht sicher, warum der Krieg Datei durch Jenkin erzeugt wird Problem verursacht.

Jede Hilfe zu diesem wird geschätzt.

Antwort

7

Sie scheinen die gleiche Klasse (SerializationConfig) aus zwei verschiedenen JAR-Dateiabhängigkeiten zu ziehen. Aus Ihrer Frage ist klar, dass der in com.fasterxml.jackson.databind (der im Stack-Trace zitiert wird) entweder in der jackson-databind-2.7.3.jar oder im jersey-all-2.18.jar zu finden ist :

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 

würde ich zunächst versuchen, Ihre Abhängigkeiten pare zurück, so dass Sie entweder jackson-databind-2.7.3.jar oder Jersey-all-2.18.jar verlassen, aber nicht beide. Wenn Ihre Anwendung mit dem einen oder dem anderen Programm funktioniert, vermute ich, dass dies Ihr Problem behebt (obwohl ich zugegeben habe, dass ich Spring 'Nachricht "No unique bean of type ... is defined" erwartet habe) und ich habe es nicht bemerkt in deinem Post).

Wie auch immer, wenn ich richtig liege, dann ist das Artefakt des Ladens von Klassen anders in Ihrer lokalen Umgebung als das, was im Jenkins-generierten Artefakt passiert und auf Ihrem Server implementiert ist (zusätzliche Komplexität hier). -Sie möchten vielleicht Ihren Server nach verfügbaren Bibliotheken durchsuchen und genau verstehen, in welcher Reihenfolge Ihre Klassen geladen werden - kein Spaß, ich weiß.

am source code für SerializationConfig Klasse Jackson Spähen, finde ich die folgenden, die Dinge interessant, wenn die Klassen in den beiden verschiedenen JAR-Dateien sind nicht wirklich identisch ..

private static final long serialVersionUID = 1 

Hoffe, es hilft machen könnte. Viel Glück!

EDIT 1:

Es könnte ein Paar einzurichten von Builds produziert so genannte „Fett jar“ Dateien mit einigen Embedded Server wie Tomcat oder Jetty interessant sein. Sie könnten etwas daraus lernen, wenn Sie das Verhalten des lokal produzierten gegen das auf Jenkins produzierte vergleichen. Siehst du das gleiche Problem?Wenn Sie die Fat Jar-Dateien verwenden, haben Sie eine explizitere Kontrolle über die bereitgestellte Umgebung als bei der Bereitstellung in einem vorhandenen (und vorkonfigurierten, änderbaren) Container.

EDIT 2:

Paar Dinge, die Sie könnte helfen, herauszufinden, Ihrer Umgebung Unterschiede zu tun ..

mvn dependency:tree 

oder, wenn man viel Geduld haben

mvn -X 
2

Sind Bist du sicher, dass Jenkins den Build säubert, dh dass er "mvn clean install" aufruft und nicht nur "mvn install"? Sobald ich "mvn clean install" auf meinem lokalen Computer verwendet habe, ist die Ausnahme verschwunden und die App wurde erfolgreich gestartet.

<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> 
Verwandte Themen