2016-09-09 4 views
8

मेरे पास एक वसंत बूट ऐप है जो मेरे स्थानीय में "एमवीएन क्लीन इंस्टॉल" का उपयोग करके तैनाती करता है, लेकिन जब जेनकिन के माध्यम से युद्ध उत्पन्न होता है, तो यह निम्न त्रुटि फेंक रहा है।जैक्सन डाटाबेस क्लासपाथ मुद्दा

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 युद्ध फ़ाइलों की तुलना करने की कोशिश की तुलना और मुझे नहीं देख JDK लघु संस्करण को छोड़कर किसी भी diff संकलित करने के लिए इस्तेमाल किया जा रहा।

मैं अपने स्थानीय निर्माण में और Jenkin निर्माण में SerializationConfig.class के लिए खोज करने के लिए

नीचे आदेश के लिए उत्पादन होता है,

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

स्थानीय युद्ध ओ/पी की कोशिश की: -

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 युद्ध ओ/पी: -

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 के माध्यम से उत्पन्न किया जा रहा।

इस पर किसी भी मदद की सराहना की जाएगी।

उत्तर

7

आप दो अलग-अलग जार फ़ाइल निर्भरताओं से एक ही कक्षा (SerializationConfig) खींच रहे हैं। आपके प्रश्न से, यह स्पष्ट है कि com.fasterxml.jackson.databind (जिसे स्टैक ट्रेस में उद्धृत किया गया है) में से एक जैक्सन-डाटाबेस-2.7.3.jar या जर्सी-ऑल-2.18.जर में पाया जा सकता है। :

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 

मैं पहली बार अपने निर्भरता वापस धीरे-धीरे कम करने के लिए ऐसी है कि आप या तो जैक्सन-DataBind-2.7.3.jar या जर्सी-सब-2.18.jar पर भरोसा करते हैं की कोशिश करेंगे, लेकिन दोनों नहीं। यदि आपका आवेदन एक या दूसरे के साथ काम करेगा, तो मुझे संदेह है कि इससे आपकी समस्या ठीक हो जाएगी (हालांकि मैं मानता हूं कि मुझे स्प्रिंग के "कोई अद्वितीय बीन प्रकार परिभाषित नहीं किया गया है" संदेश देखने की उम्मीद है और मैंने इसे नहीं देखा आपकी पोस्ट में)।

वैसे भी, यदि मैं सही हूं, तो आप जो देख रहे हैं वह क्लास लोडिंग का एक आर्टिफैक्ट है जो आपके स्थानीय पर्यावरण बनाम अलग-अलग हो रहा है। जेनकिंस से उत्पन्न आर्टिफैक्ट में क्या होता है और आपके सर्वर पर तैनात किया जाता है (यहां अतिरिक्त जटिलता- - आप किसी भी प्रदत्त libs के लिए अपने सर्वर की जांच करना चाहते हैं और समझ सकते हैं कि आपकी कक्षा लोडिंग क्या हो रहा है - मजेदार नहीं, मुझे पता है)।

जैक्सन के SerializationConfig वर्ग के लिए source code पर देखना, मैं निम्नलिखित है, जो चीजों को दिलचस्प बना सकता है अगर दो अलग जार फ़ाइलों में कक्षाएं वास्तव में समान नहीं हैं ..

private static final long serialVersionUID = 1 

आशा है कि यह मदद करता है लगता है। सौभाग्य!

संपादित करें 1:

यह बनाता बिलाव या घाट जैसे कुछ एम्बेडेड सर्वर के साथ तथाकथित "वसा जार" फ़ाइलें उत्पादन की एक जोड़ी स्थापित करने के लिए दिलचस्प हो सकता है। यदि आप जेनकिन्स पर उत्पादित एक बनाम स्थानीय रूप से उत्पादित करते हैं, तो आप उससे कुछ सीख सकते हैं। क्या आप एक ही समस्या देखते हैं?वसा जार फ़ाइलों का उपयोग करते हुए, यदि आप मौजूदा (और पूर्व-कॉन्फ़िगर किए गए, परिवर्तनीय) कंटेनर में तैनात करते हैं, तो आपके द्वारा तैनात वातावरण पर आपके पास अधिक स्पष्ट नियंत्रण होता है।

संपादित करें 2:

चीजों की युगल आप हो सकता है अगर आप धैर्य का एक बहुत

mvn -X 
2

हैं है बाहर अपने वातावरण मतभेद मदद आंकड़ा करने के लिए ..

mvn dependency:tree 

या, आप सुनिश्चित हैं कि जेनकींस बिल्ड को साफ करता है, यानी यह कहता है कि "एमवीएन क्लीन इंस्टॉल करें" और न केवल "एमवीएन इंस्टॉल"? एक बार जब मैंने अपने स्थानीय पर "एमवीएन क्लीन इंस्टॉल" का इस्तेमाल किया तो अपवाद गायब हो गया और ऐप सफलतापूर्वक लॉन्च हो गया।

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