2016-09-09 3 views
8

내 로컬에 "mvn clean install"을 사용하여 배포 할 때 잘 작동하는 스프링 부팅 응용 프로그램이 있지만 Jenkin을 통해 전쟁이 생성되면 다음 오류가 발생합니다. 난 그냥 넘어 사용하여 두 WAR 파일을 비교하는 시도Jackson Databind classpath 문제

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) 

비교하고 나는 JDK 부 버전을 제외한 모든 DIFF 컴파일하는 데 사용되는 참조니까.

나는, 내 로컬 빌드와 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 

Jenkin 전쟁 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 
다음과 같이 war 파일이 문제를 일으키는 Jenkin을 통해 생성되는 이유를 0

는 기본적으로, 나는

@Inject 
    private ObjectMapper objectMapper; 

확실하지, 내 TestRestConfiguration 클래스의 ObjectMapper를 주입.

이 문제에 대한 도움을 주시면 감사하겠습니다.

답변

7

두 개의 서로 다른 jar 파일 종속성에서 동일한 클래스 (SerializationConfig)를 가져 오는 것 같습니다. 귀하의 질문에, com.fasterxml.jackson.databind (stack trace에서 인용 된)는 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 

내가 먼저 잭슨 - 데이터 바인딩-2.7.3.jar 또는 저지 - 모든 2.18.jar 중 하나에 의존하도록 의존성을 다시 깎다하려고 할 것이지만, 둘. 응용 프로그램이 다른 응용 프로그램과 함께 작동하는 경우이 문제가 해결 될 것으로 판단됩니다 (비록 내가 Spring의 "고유 한 bean 없음 ... 정의 됨"메시지를 볼 것으로 예상 했음에도 불구하고이를 인식하지 못했습니다. 귀하의 게시물에).

어쨌든, 내가 맞다면 로컬 환경에서 다르게 발생하는 클래스 로딩의 결과 대 젠킨스 생성 아티팩트에서 일어난 일과 서버에 배포 된 것입니다. 제공된 라이브러리에 대해 서버를 면밀히 조사하고 클래스로드가 어떤 순서로 진행되는지 정확히 이해하고 싶을 수도 있습니다. 재미는 아닙니다. 잭슨의 SerializationConfig 클래스의 source code에서 엿

, 나는 두 개의 다른 jar 파일의 클래스가 실제로 동일하지 않은 경우 일을 재미있게 만들 수있는 다음 ..
private static final long serialVersionUID = 1 

가 도움이 희망을 찾을 수 있습니다. 행운을 빕니다!

편집 1 :

는 톰캣이나 부두 같은 일부 임베디드 서버와 소위 "지방 항아리"파일을 생성 빌드 한 쌍을 설정하는 흥미로운 일이 될 수 있습니다. 젠킨스에서 생산 된 제품과 로컬에서 생산 된 제품의 동작을 비교하면 무언가를 배울 수 있습니다. 같은 문제가 보이십니까?fat jar 파일을 사용하면 기존 (및 사전 구성되고 변경 가능한) 컨테이너에 배포하는 경우보다 배포 된 환경을보다 명확하게 제어 할 수 있습니다.

편집 2 :

mvn -X 
2

이 있습니까 인내심이 많은 경우 당신이 수도 일의

커플 .. 환경의 차이에서

mvn dependency:tree 

를 도움 그림을하거나하는 젠킨스가 빌드를 깨끗하게 처리했는지 확인하십시오. 즉, "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>