java.lang.NoClassDefFoundError: वर्ग XXX को प्रारंभ नहीं कर सका


165
public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;

class PropHolderमेरा अपना एक वर्ग है। वर्ग मुख्य कक्षा की उसी JAR फ़ाइल में रहता है। इसलिए ऐसा नहीं करना चाहिए क्योंकि कोई भी JAR क्लासपाथ से गायब है।

जब मैं JAR फ़ाइल jar tf myjarfileको देखता हूं, तो मैं देख सकता हूंPropHolder.class वहाँ सूचीबद्ध ।

Btw: कोड मेरे स्थानीय मशीन पर ठीक चल रहा है। लेकिन काम नहीं कर सका जब मैंने इसे लिनक्स सर्वर पर कुछ स्क्रिप्ट के साथ तैनात किया। इसलिए मुझे लगता है कि यह कोड की समस्या नहीं है। लेकिन किसी कारण से। तैनात करने की प्रक्रिया को ट्रैक करना बहुत कठिन है।

क्या समस्या हो सकती है?


क्या क्लास पैकेज से मिलान करने के लिए आपके जार में उपयुक्त निर्देशिका संरचना है?
जॉन बी।

कुछ स्रोत देखने की जरूरत है, कई चीजें इसका कारण बन सकती हैं। उदाहरण के लिए, एक 'पैकेज' स्टेटमेंट लेकिन फाइल वास्तव में संबंधित पथ में नहीं है
jcomeau_ictx

3
प्रारंभ के दौरान एक कारण एक अपवाद है - क्या कोई अन्य त्रुटि आउटपुट है?
माइकल ब्रूवर-डेविस

जवाबों:


211

मेरा सबसे अच्छा शर्त यह है कि यहाँ एक मुद्दा है:

static {
    //code for loading properties from file
}

यह प्रतीत होता है कि कुछ अनियोजित अपवाद घटित हुए और कक्षा को लोड करने के प्रयास में वास्तविक ClassLoader तक प्रचारित किया गया। हालांकि हमें इसकी पुष्टि करने के लिए स्टैकट्रेस की आवश्यकता होगी।

PropHolder.propस्थिर चर बनाते समय या तो ऐसा हुआ ।


मैं बार-बार उसी समस्या का सामना कर रहा हूं। मुझे यकीन है कि यह staticमुद्दे की वजह से है । समस्या के समाधान के लिए क्या किया जाना चाहिए?
सांप

1
आपको यह पहचानना होगा कि staticब्लॉक से किस अपवाद को फेंका जा रहा है । डिबग करने के लिए इसे try/catch(Exception e)पूरे ब्लॉक के चारों ओर रखें और अपवाद लॉग करें। आपको उस अपवाद को ठीक करना होगा। आमतौर पर अपवाद को लॉग किया जाएगा, लेकिन क्लास लोडिंग के दौरान लॉग होने के बाद से इसे खोजना मुश्किल हो सकता है जो बहुत जल्दी हो सकता है
जॉन विंट

हां मैंने कोड को try catchब्लॉक में रखा था और यह कहा था Failed to initialize ClassA। मुझे लगता है कि यह समस्या है JVM। मैंने अपने सिस्टम को फिर से शुरू किया और फिर सब कुछ ठीक चला। मैं अपने सिस्टम को फिर से शुरू किए बिना भविष्य में इस समस्या को कैसे हल करूं और एक सरल सॉल्यूशन के साथ समस्या को हल करूं।
वाइपर

ClassA को इनिशियलाइज़ करने में असफल होना किसी और चीज़ का साइड इफ़ेक्ट है। causeयदि उपलब्ध हो तो आप देखना चाहेंगे । A NoClassDefFoundErrorहमेशा किसी अन्य त्रुटि से जुड़ा होता है, आपको लॉग में इसे देखने की आवश्यकता होगी या इसे और अधिक उचित रूप से लॉग इन करने का प्रयास करना होगा (जैसे फ़ाइल सिस्टम पर लॉगिंग को नए फोर्स में लागू करना)
जॉन विंट

यह अधिक आसानी से पता लगाने योग्य होगा यदि जावा एक त्रुटि फेंक सकता है। InNotInitializeStaticPartOfClassError या कुछ और। फिर हम डेवलपर के रूप में जानते हैं कि कहां देखना है।
मैर्टन

126

आपको एक java.lang.NoClassDefFoundErrorऐसा मिल रहा है, जिसका मतलब यह नहीं है कि आपकी कक्षा गायब है (उस स्थिति में आपको मिलेगा java.lang.ClassNotFoundException)। क्लास पढ़ने की कोशिश करते समय क्लास की परिभाषा पढ़ते समय क्लास-बॉलर एक त्रुटि में भाग गया।

अपने स्थिर इनिलाइज़र के अंदर एक कोशिश / पकड़ रखो और अपवाद को देखो। यदि आप वहां कुछ फाइलें पढ़ते हैं और यह आपके स्थानीय परिवेश से अलग है, तो यह समस्या का कारण है (शायद फ़ाइल नहीं मिल सकती है, कोई अनुमति नहीं है)।


1
एक स्पष्टता यह है कि भले ही NoClassDefFoundError एक ClassNotFoundException का अर्थ नहीं करता है, फिर भी यह NoClassDefFoundError का संभावित कारण है।
जॉन विन्ट

1
buf अगर आपके पास एक ClassNotFoundException थी तो ClassLoader / क्लास को लोड करने की कोशिश कभी नहीं कर सकता था, है ना?
जेह

4
एक वर्ग दूसरे वर्ग को लोड कर सकता है जो नहीं मिला था। उस उदाहरण में अभी भी एक ClassNotFoundException
John Vint

1
मुझे स्पष्ट करना चाहिए था, मेरा मतलब केवल एक अपवाद था।
वोट

1
यह वास्तव में यहाँ मददगार था, क्योंकि मैंने लगभग 20 मिनट खर्च किए हैं जिसमें JAR (रिपोर्ट की गई श्रेणी) का सत्यापन शामिल है। एक बार जब मुझे एहसास हुआ कि मैं गलत दिशा में देख रहा हूं, तो मुझे आसानी से समझ में आ गया कि कुछ एनोटेशन क्लास गायब है और वोइला, रिपोर्ट की गई थी @Stateless, इसलिए मैंने सिर्फ इसी निर्भरता को जोड़ा और आगे बढ़ने में सक्षम था। पारितोषिक के लिए धन्यवाद!
RAM237

33

NoClassDefFoundError स्थैतिक ब्लॉक के अंदर क्या गलत हो गया था के रूप में ज्यादा सुराग नहीं देता है। स्थैतिक के अंदर हमेशा इस तरह का एक ब्लॉक होना अच्छा होता है {...} आरंभीकरण कोड:

static {
  try {

    ... your init code here

  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}

कोटलिन में यह कैसे करें?
मार्लोन

संकेत देने के लिए धन्यवाद। मेरे मामले में मुझे स्थैतिक लाइन आरंभीकरण पर एनपीई मिल रहा था।
अभिषेक

3

मेरे पास एक ही अपवाद था, इस तरह से मैंने समस्या हल की है:

पूर्व शर्त:

  1. जुनित वर्ग (और परीक्षण), जिसने एक और वर्ग बढ़ाया।

  2. ApplicationContext ने वसंत का उपयोग करके इनिशियलाइज़ किया, जो प्रोजेक्ट को इनविट करता है।

  3. एप्लिकेशन संदर्भ को @ विधि में प्रारंभ किया गया था

उपाय:

@BeforeClass मेथड से एप्लिकेशन सन्दर्भ को छोड़ दें, क्योंकि पैरेंट क्लास को भी कुछ क्लासेस की आवश्यकता होती है, जो कि एप्लीकेशन सन्दर्भ के भीतर से इनिशियलाइज़ की गई थी।

आशा है कि यह मदद करेगा।


2

जैसा कि ऊपर उल्लेख किया गया है, यह कई चीजें हो सकती हैं। मेरे मामले में मेरे पास एक वैधानिक रूप से आरंभिक चर था जो मेरे गुणों की फाइल में एक लापता प्रविष्टि पर निर्भर था। गुण फ़ाइल में अनुपलब्ध प्रविष्टि को जोड़ा गया और समस्या हल हो गई।


1

अभी कुछ दिनों पहले, मैं भी तुम्हारी तरह ही एक ही सवाल पर मिला था। मेरे स्थानीय मशीन पर सभी कोड अच्छी तरह से चलते हैं, लेकिन त्रुटि (noclassdeffound और initialize) निकलती है। इसलिए मैं अपना समाधान पोस्ट करता हूं, लेकिन मुझे नहीं पता कि क्यों, मैं केवल एक संभावना को आगे बढ़ाता हूं। मुझे आशा है कि कोई व्यक्ति इसे समझाएगा। @ जॉन विन्ट सबसे पहले, मैं आपको अपनी समस्या दिखाऊंगा। मेरे कोड में स्थिर चर और स्थिर ब्लॉक दोनों हैं। जब मैं पहली बार इस समस्या से मिला, मैंने जॉन विंट के समाधान की कोशिश की, और अपवाद को पकड़ने की कोशिश की। हालाँकि, मैंने कुछ नहीं पकड़ा। इसलिए मैंने सोचा कि यह स्थिर चर है (लेकिन अब मुझे पता है कि वे एक ही चीज हैं) और अभी भी कुछ भी नहीं मिला। इसलिए, मैं लाइनक्स मशीन और मेरे कंप्यूटर के बीच अंतर खोजने की कोशिश करता हूं। तब मैंने पाया कि यह समस्या केवल तब होती है जब कई थ्रेड्स एक प्रक्रिया में चलते हैं (वैसे, लाइनक्स मशीन में डबल कोर और डबल कोर होता है)। इसका मतलब है कि अगर दो प्रक्रियाएँ हैं (दोनों उस कोड का उपयोग करती हैं जिसमें स्टैटिक ब्लॉक या वैरिएबल हैं) एक ही प्रक्रिया में चलते हैं, तो यह गलत हो जाता है, लेकिन यदि वे अलग-अलग प्रक्रियाओं में चलते हैं, तो दोनों ठीक हैं। लिनक्स मशीन में, मैं उपयोग करता हूं

mvn -U clean  test -Dtest=path 

किसी कार्य को चलाने के लिए, और क्योंकि मेरा स्थिर चर एक कंटेनर शुरू करने के लिए है (या शायद आप एक नए क्लास लोडर को इनिशियलाइज़ करते हैं), इसलिए यह तब तक रहेगा जब तक कि jvm बंद नहीं हो जाता, और jvm तभी रुकता है जब एक प्रक्रिया में सभी कार्य रुक जाते हैं। प्रत्येक कार्य एक नया कंटेनर (या क्लास लोडर) शुरू करेगा और यह jvm को भ्रमित करता है। परिणामस्वरूप, त्रुटि होती है। तो, इसे कैसे हल किया जाए? मेरा समाधान मावेन कमांड में एक नई कमांड जोड़ना है, और प्रत्येक कार्य को एक ही कंटेनर में जाना है।

-Dxxx.version=xxxxx #sorry can't post more

हो सकता है कि आपने इस समस्या को पहले ही हल कर लिया हो, लेकिन फिर भी यह आशा करता है कि यह दूसरों को भी मदद करेगा जो एक ही समस्या को पूरा करते हैं।


क्या अधिक है, जब कोड लिनक्स मशीन पर चलता है, तो ऊपर की त्रुटि का पालन करें, एक और समस्या है: java.lang.ExceptionInInitializerError: nullइसका मतलब है कि क्लास लोडर में क्लास नहीं मिल सकता है, या जो एक लोड करने का पता नहीं है (मुझे लगता है)। क्या आप उससे मिले थे?
मंकीकिंग

1

मेरे पास एक ही अपवाद था - लेकिन केवल डिबग मोड में चलने के दौरान, इस तरह मैंने समस्या को हल किया (3 पूरे दिनों के बाद): build.gradle में मेरे पास था: defaultConfig सेक्शन में "मल्टीडेक्सएनेबल ट्रू" सेट।

        defaultConfig {
    applicationId "com.xxx.yyy"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 5123
    versionName "5123"
    // Enabling multidex support.
    multiDexEnabled true
}

लेकिन स्पष्ट रूप से यह पर्याप्त नहीं था। लेकिन जब मैं बदल गया:

public class MyAppClass  extends Application 

सेवा:

public class MyAppClass  extends MultiDexApplication 

यह हल हो गया। आशा है कि यह किसी की मदद करेगा


0

यदि आप एंड्रॉइड प्रोजेक्ट पर काम कर रहे हैं, तो सुनिश्चित करें कि आप किसी भी एंड्रॉइड क्लास पर किसी भी स्टैटिक तरीके को कॉल नहीं कर रहे हैं। मैं केवल JUnit + Mockito का उपयोग कर रहा हूं, इसलिए हो सकता है कि कुछ अन्य फ्रेमवर्क आपको समस्या से पूरी तरह से बचने में मदद करें, मुझे यकीन नहीं है।

मेरी समस्या Uri.parse(uriString)एक इकाई परीक्षण के लिए एक स्टेटिक इनिशियलाइज़र के हिस्से के रूप में कह रही थी । उरी क्लास एक एंड्रॉइड एपीआई है, यही वजह है कि यूनिट टेस्ट बिल्ड इसे नहीं मिल सका। मैंने इस मूल्य को nullबदले और सब कुछ सामान्य हो गया।


0

मुझे एक ही समस्या थी ava java.lang.NoClassDefFoundError: वर्ग com.xxx को प्रारंभ नहीं कर सका। HttpUtils

static {
    //code for loading properties from file
}

यह पर्यावरण की समस्या है। इसका मतलब है कि आवेदन में गुण गलत या खाली है!


0

मैं उसी समस्या का सामना करता हूं। मैंने नीचे की तरह स्थिर ब्लॉक में एक बीन वस्तु का प्रवेश किया:

static {
    try{
        mqttConfiguration = SpringBootBeanUtils.<MqttConfiguration>getBean(MqttConfiguration.class);
    }catch (Throwable e){
        System.out.println(e);
    }
 }

सिर्फ इसलिए कि इस प्रक्रिया के कारण मेरी सेम ऑबजेंट में एनपीई हुआ, मुझे इसमें परेशानी हुई। इसलिए मुझे लगता है कि आपको ध्यान से स्थिर कोड ब्लॉक की जांच करनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.