मुझे जावा में NoClassDefFoundError क्यों मिल रहा है?


529

NoClassDefFoundErrorजब मैं अपना जावा एप्लिकेशन चलाता हूं तो मुझे मिल रहा है। आमतौर पर इसका कारण क्या है?


1
मेरा मानना ​​है कि अगर आप अपने जावा प्रोग्राम को सही सिंटैक्स के साथ नहीं चलाते हैं तो यह भी हो सकता है। उदाहरण के लिए, आपको अपनी कक्षा को पूर्ण पैकेज नाम (यानी। My.package.myClass) के साथ रूट बिन फ़ोल्डर से कॉल करना होगा। मैं और अधिक विशिष्ट होता अगर मैं कर सकता था, लेकिन मैं एक जावा आदमी के ज्यादा नहीं हूं। मुझे याद है कि यह कुछ समय के लिए गड़बड़ है।
फ्रैंक हैडर

17
@BoltClock हमें कई डुप्लिकेट को इंगित करने के लिए एक विहित प्रश्न की आवश्यकता है। यह क्यों नहीं हो सकता?
रायडवल

21
क्या आपने स्वीकार किए गए उत्तर को बदलने पर विचार किया है ताकि जिस समुदाय को अधिक मूल्यवान लगता है वह सबसे ऊपर है?
मार्टिन स्मिथ

जवाबों:


263

ऐसा तब होता है जब कोई क्लास फ़ाइल होती है जो आपके कोड पर निर्भर करती है और यह संकलन समय पर मौजूद है लेकिन रनटाइम पर नहीं मिली है। अपने निर्माण समय और रनटाइम क्लासपैथ में अंतर देखें।


1
गलत नेमस्पेस / पैकेज के तहत स्रोत फ़ाइल डालते समय मुझे यह त्रुटि हुई थी। मुझे लगा कि मैं इसे कहीं भी रख सकता हूं, और कंपाइलर खुश था। पता चलता है कि मुझे खुश रहने के लिए रनटाइम के लिए अधिक मेहनती होना चाहिए था।
सेंटरऑर्बिट

1
मुझे यह त्रुटि एक बार हुई थी जब एक फ़ाइल अपलोड के दौरान मेरा सर्वर मेमोरी से बाहर चला गया था। जब भी मैंने अपलोड करने की कोशिश की, मुझे एक अलग त्रुटि मिली। आखिरकार इसने मुझे बताया कि मेरे पास पर्याप्त जगह नहीं है।
जेम्स एम। लेट

80
यह उत्तर आवश्यक रूप से सही नहीं है और कई लोगों को गुमराह करने वाला होगा! नीचे Jared से बेहतर जवाब देखें।
डेव एल।

4
@DaveL। धन्यवाद! 400+ अपवोट्स के साथ जेरेड का जवाब नीचे दिया गया है! -4 अप (डाउन?) वोट के साथ एक उत्तर इसके ऊपर है। एसओ के जवाब देने के तर्क के बारे में कुछ गड़बड़ है।
सौरभ पाटिल

1
यह किसी के लिए एक लंबा-शॉट है, लेकिन मुझे इस त्रुटि का सामना करना पड़ा क्योंकि कक्षा में विचाराधीन एक SimpleDateFormat था जिसे एक अमान्य चरित्र के साथ आरम्भ किया गया था (I में 'T' के बजाय बीच में T) था।
रायन डी

816

हालांकि यह संभव है कि यह संकलन-समय और रन-टाइम के बीच एक क्लासपैथ बेमेल के कारण है, यह जरूरी नहीं कि सच है।

इस मामले में दो या तीन अलग-अलग अपवादों को सीधे हमारे सिर पर रखना महत्वपूर्ण है:

  1. java.lang.ClassNotFoundException यह अपवाद इंगित करता है कि कक्षा को क्लासपाथ पर नहीं मिला था। यह इंगित करता है कि हम कक्षा की परिभाषा को लोड करने की कोशिश कर रहे थे, और कक्षा में क्लासपैथ मौजूद नहीं था।

  2. java.lang.NoClassDefFoundError यह अपवाद इंगित करता है कि JVM ने अपने आंतरिक वर्ग परिभाषा डेटा संरचना में एक वर्ग की परिभाषा के लिए देखा और इसे नहीं पाया। यह कहने से अलग है कि इसे क्लासपाथ से लोड नहीं किया जा सकता था। आमतौर पर यह इंगित करता है कि हमने पहले क्लासपाथ से एक कक्षा को लोड करने का प्रयास किया था, लेकिन यह किसी कारण से विफल हो गया - अब हम फिर से कक्षा का उपयोग करने की कोशिश कर रहे हैं (और इसलिए इसे लोड करने की आवश्यकता है, क्योंकि यह पिछली बार विफल हुआ था), लेकिन हम ' फिर भी इसे लोड करने की कोशिश नहीं की जाएगी, क्योंकि हम इसे पहले लोड करने में विफल रहे (और यथोचित संदेह है कि हम फिर से विफल हो जाएंगे)। पहले की विफलता एक ClassNotFoundException या ExceptionInInitializerError (स्थैतिक आरंभीकरण ब्लॉक में विफलता का संकेत) या किसी भी अन्य समस्या हो सकती है। मुद्दा यह है कि, एक NoClassDefFoundError जरूरी एक classpath समस्या नहीं है।


30
NoClassDefFoundError के कारण का उल्लेख करने के लिए धन्यवाद, इससे मुझे बहुत मदद मिली! मेरे मामले में एक ExceptionInInitializerError को पहले फेंक दिया गया था, यही कारण है कि मुझे स्थिर ब्लॉकों में त्रुटियों के बारे में पता चला।
थॉमस

@ जेरेड, जब मैं मिल रहा हूं Error: Could not find or load main class, तो इसे किस श्रेणी की त्रुटि के तहत वर्गीकृत किया जाएगा?
विक्रम

@Pops: क्रिया की वस्तुओं को "कोशिश" करने के लिए भाषा को और अधिक क्रियाशील बनाया गया है :) :)
Jared

1
@ विक्रम "मुख्य वर्ग को ढूंढ या लोड नहीं कर सका" एक जावा अपवाद नहीं है, यह लॉन्चर (जो कि JAR और मुख्य प्रकट विशेषता का निरीक्षण करता है) के कारण होता है।
Eckes

2
ClassNotFoundException को भी तब फेंका जाता है जब किसी क्लास में स्टैटिक इनिशियलाइज़ेशन होता है जो किसी एरर या अपवाद को फेंकता है। उन्हें शायद उस घटना के लिए एक अलग नाम चुनना चाहिए था।
कोलैड

124

यहाँ उदाहरण के लिए कोड है java.lang.NoClassDefFoundError। कृपया विस्तृत विवरण के लिए जेरेड का उत्तर देखें ।

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

3
और कारण यह है कि पहली कोशिश के बाद jvm को पहले से ही पता नहीं है कि वह काम पर नहीं जा रहा है और दूसरी बार अलग-अलग अपवादों को फेंक सकता है?
इकामेन

@ikamen जाहिर है कि यह SimpleCalculatorशून्य से विभाजित होने के बाद असफल वर्ग की तुलना में कहीं संग्रहीत है ? क्या किसी के पास इस व्यवहार के लिए आधिकारिक दस्तावेज का संदर्भ है?
ᴠɪɴᴄᴇɴᴛ

4
@PhilipRego को यकीन नहीं है कि 'शुद्ध' NoClassDefFoundError से आपका क्या मतलब है। पहली बार new SimpleCalculator()कहा जाता है, आपको ArithmeticException की वजह से ExceptionInInitializerError मिलता है। दूसरी बार जब आप कॉल new SimpleCalculator()करते हैं तो आपको NoClassDefFoundError किसी अन्य की तरह शुद्ध मिलती है। मुद्दा यह है कि आप साधारण कारण के अलावा एक कारण के लिए एक NoClassDefFoundError प्राप्त कर सकते हैं। रनटाइम पर क्लासपैथ पर नहीं होने के कारण।
हार्पर्सका

36

जावा में NoClassDefFoundError

परिभाषा:

  1. जावा वर्चुअल मशीन रनटाइम पर एक विशेष वर्ग को खोजने में सक्षम नहीं है जो संकलन समय पर उपलब्ध था।

  2. यदि कोई वर्ग संकलन समय के दौरान मौजूद था, लेकिन रनवे के दौरान जावा क्लासपथ में उपलब्ध नहीं था।

यहाँ छवि विवरण दर्ज करें

उदाहरण:

  1. क्लास क्लासपाथ में नहीं है, यह जानने का कोई निश्चित शॉट तरीका नहीं है, लेकिन कई बार आप सिर्फ़ System.getproperty ("java.classpath") को प्रिंट करने के लिए देख सकते हैं और यह क्लासपैथ को वहां से प्रिंट कर देगा जहां आप कम से कम प्राप्त कर सकते हैं आपके वास्तविक रनटाइम क्लासपाथ का एक विचार।
  2. NoClassDefFoundError का एक सरल उदाहरण है क्लास एक लापता JAR फ़ाइल से संबंधित है या JAR को क्लासपाथ में नहीं जोड़ा गया था या कभी-कभी जार का नाम किसी के द्वारा बदल दिया गया था जैसे मेरे मामले में मेरे एक सहयोगी ने tibco.jar को tibco_v3.jar में बदल दिया है और कार्यक्रम है java.lang.NoClassDefFoundError के साथ असफल होना और मैं सोच रहा था कि क्या गलत है।

  3. बस स्पष्ट रूप से-क्लासपास विकल्प के साथ चलने की कोशिश करें जो आपको लगता है कि क्लासपाथ के साथ काम करेगा और यदि यह काम कर रहा है तो यह एक निश्चित छोटा संकेत है कि कोई व्यक्ति जावा क्लासपथ से आगे निकल रहा है।

  4. JAR फ़ाइल पर अनुमति समस्या जावा में NoClassDefFoundError भी पैदा कर सकती है।
  5. XML कॉन्फ़िगरेशन पर टाइपो भी जावा में NoClassDefFoundError का कारण बन सकता है।
  6. जब आपका संकलित वर्ग जो एक पैकेज में परिभाषित किया गया है, उसी पैकेज में मौजूद नहीं है, जैसे कि JApplet के मामले में लोड होने पर यह जावा में NoClassDefFoundError फेंक देगा।

संभव समाधान:

  1. जावा क्लासपाथ में कक्षा उपलब्ध नहीं है।
  2. यदि आप कई क्लास लोडर के बीच कक्षा की दृश्यता की तुलना में J2EE वातावरण में काम कर रहे हैं, तो java.lang.NoClassDefFoundError भी हो सकता है, विस्तृत चर्चा के लिए उदाहरण और परिदृश्य अनुभाग देखें।
  3. अपनी लॉग फ़ाइल में java.lang.ExceptionInInitializerError की जाँच करें। स्थैतिक आरंभीकरण की विफलता के कारण NoClassDefFoundError काफी आम है।
  4. क्योंकि NoClassDefFoundError java.lang.LinkageError का एक उपवर्ग है, इसलिए यह भी आ सकता है यदि इसमें से किसी एक पर मूल लाइब्रेरी जैसी निर्भरता उपलब्ध न हो।
  5. कोई भी स्टार्ट-अप स्क्रिप्ट Classpath पर्यावरण चर को ओवरराइड कर रहा है।
  6. आप जार कमांड का उपयोग करके अपना प्रोग्राम चला रहे होंगे और क्लास को मैनिफ़ेस्ट फ़ाइल के क्लासपैथ विशेषता में परिभाषित नहीं किया गया था।

संसाधन:

NoClassDefFoundError को हल करने के 3 तरीके

java.lang.NoClassDefFoundError समस्या पैटर्न


1
बहुत बढ़िया जवाब। मुझे लगता है कि मैंने आपके द्वारा सुझाई गई हर चीज को आजमा लिया है और अभी भी वह समस्या है मैं वसंत के साथ काम करने वाले जार के कारण इनमें से कुछ को बाहर कर सकता हूं, लेकिन लगता है कि इसे java.sql (हाना के लिए एसएपी डीबी ड्राइवर) पसंद नहीं है।
जेई कार्टर II

इसे वास्तव में System.getproperty ("java.class.path") कहा जाता है
RIJIK

33

मैंने पाया है कि कभी-कभी मुझे एक NoClassDefFound त्रुटि मिलती है जब कोड रनटाइम पर पाए जाने वाले वर्ग के असंगत संस्करण के साथ संकलित किया जाता है। मुझे याद है कि विशिष्ट उदाहरण अपाचे अक्ष पुस्तकालय के साथ है। मेरे रनटाइम क्लासपाथ पर वास्तव में 2 संस्करण थे और यह तारीख और असंगत संस्करण को बाहर निकाल रहा था और सही नहीं था, जिसके कारण NoClassDefFound त्रुटि हुई। यह एक कमांड लाइन ऐप में था जहां मैं इसके समान कमांड का उपयोग कर रहा था।

set classpath=%classpath%;axis.jar

मैं इसका उपयोग करके उचित संस्करण लेने में सक्षम था:

set classpath=axis.jar;%classpath%;

4
एक ही मुद्दा था। यह बताता है कि मैंने Java7 के साथ युद्ध फाइल संकलित की है, लेकिन मेरा टॉमकट इंस्टालेशन Java6 का उपयोग कर रहा था। मुझे अपने पर्यावरण चर
duvo

4
अगर ऐसा होता है, तो मैं कहूंगा कि जावा गड़बड़ है। +2 अगर यह सच है। अभी तक इसे सत्यापित नहीं किया जा सका है। अगर सही पाया जाता है + 1 फिर से (टिप्पणियों में)
सुपरनोवा

7

यह मेरा अब तक का सबसे अच्छा समाधान है

मान लीजिए कि हमारे पास एक पैकेज है जिसे org.mypackageकक्षाएं शामिल हैं:

  • हैलोवर्ल्ड (मुख्य वर्ग)
  • SupportClass
  • UtilClass

और इस पैकेज को परिभाषित करने वाली फाइलें भौतिक रूप से निर्देशिका के तहत D:\myprogram(विंडोज पर) या /home/user/myprogramलिनक्स पर संग्रहीत की जाती हैं ।

फ़ाइल संरचना इस तरह दिखाई देगी: यहाँ छवि विवरण दर्ज करें

जब हम जावा को लागू करते हैं, तो हम चलाने के लिए एप्लिकेशन का नाम निर्दिष्ट करते हैं org.mypackage.HelloWorld:। हालाँकि हमें जावा को यह भी बताना चाहिए कि हमारे पैकेज को परिभाषित करने वाली फ़ाइलों और निर्देशिकाओं को कहाँ देखना है। इसलिए प्रोग्राम को लॉन्च करने के लिए, हमें निम्नलिखित कमांड का उपयोग करना होगा: यहाँ छवि विवरण दर्ज करें


6

मैं मावेन के साथ स्प्रिंग फ्रेमवर्क का उपयोग कर रहा था और अपनी परियोजना में इस त्रुटि को हल किया।

कक्षा में एक रनटाइम त्रुटि थी। मैं एक संपत्ति को पूर्णांक के रूप में पढ़ रहा था, लेकिन जब उसने संपत्ति फ़ाइल से मूल्य पढ़ा, तो उसका मूल्य दोगुना था।

स्प्रिंग ने मुझे एक पूर्ण स्टैक ट्रेस नहीं दिया, जिस पर रनटाइम विफल हुआ। यह बस कहा NoClassDefFoundError। लेकिन जब मैंने इसे एक देशी जावा एप्लिकेशन (एमवीसी से बाहर ले जाना) के रूप में निष्पादित किया, तो इसने दिया ExceptionInInitializerErrorजो सही कारण था और इस तरह मैंने त्रुटि का पता लगाया।

@ xli के जवाब ने मुझे जानकारी दी कि मेरे कोड में क्या गलत हो सकता है।


1
एक सर्वलेट की प्रोग्रामिंग करते समय भी मेरे साथ ऐसा ही हुआ NoClassDefFoundErrorथा ( वास्तव में इसके कारण था ExceptionInInitalizerError, जो इसके कारण था DateTimeParseException)। यह थोड़ा भ्रामक है, है ना? मुझे पता है कि उनके पास शायद इसे बनाने के लिए उनके कारण थे, लेकिन कम से कम एक छोटा संकेत होना बहुत अच्छा होगा, यह NoClassDefFoundErrorएक और अपवाद का परिणाम था, बिना इसे घटाए। बस ExceptionInInitializerErrorफिर से फेंकना अधिक स्पष्ट होगा। कभी-कभी दोनों के बीच संबंध स्पष्ट नहीं हो सकता है।
बार्टोलोमिएज ज़िलिओस्की

5

मुझे NoClassFoundError मिलता है जब रनटाइम क्लास लोडर द्वारा लोड की गई कक्षाएं जावा रूट लोडर द्वारा पहले से लोड की गई कक्षाओं तक नहीं पहुंच सकती हैं। क्योंकि अलग-अलग श्रेणी लोडर अलग-अलग सुरक्षा डोमेन (जावा के अनुसार) में होते हैं, jvm रनटाइम लोडर एड्रेस स्पेस में रूट लोडर द्वारा पहले से लोड की गई कक्षाओं को हल करने की अनुमति नहीं देगा।

'Java -javaagent: tracer.jar [आपका java ARGS]' के साथ अपना कार्यक्रम चलाएं

यह लोडेड क्लास, और लोडर env को दिखाता है जो क्लास को लोड करता है। यह बहुत उपयोगी है क्यों एक वर्ग हल नहीं किया जा सकता है।

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

1
लिंक मर चुका है। संग्रहीत संस्करण आज़माएँ: web.archive.org/web/20131216000019/https://blogs.oracle.com/…
avgvstvs

5

एक दिलचस्प मामला जिसमें आप बहुत कुछ देख सकते हैं NoClassDefFoundErrorsजब आप हैं:

  1. throwएक RuntimeExceptionमें staticअपने वर्ग के ब्लॉकExample
  2. इसे इंटरसेप्ट करें (या अगर यह सिर्फ मायने नहीं रखता है जैसे इसे एक परीक्षण मामले में फेंक दिया जाता है )
  3. इस वर्ग का एक उदाहरण बनाने की कोशिश करें Example

static class Example {
    static {
        thisThrowsRuntimeException();
    }
}

static class OuterClazz {

    OuterClazz() {
        try {
            new Example();
        } catch (Throwable ignored) { //simulating catching RuntimeException from static block
            // DO NOT DO THIS IN PRODUCTION CODE, THIS IS JUST AN EXAMPLE in StackOverflow
        }

        new Example(); //this throws NoClassDefFoundError
    }
}

NoClassDefErrorExceptionInInitializerErrorस्थैतिक ब्लॉक के साथ फेंक दिया जाएगा RuntimeException


यह विशेष रूप से महत्वपूर्ण मामला है जब आप NoClassDefFoundErrorsअपने UNIT TESTS में देखते हैं ।

एक तरह से आप staticपरीक्षणों के बीच ब्लॉक निष्पादन को "साझा" कर रहे हैं , लेकिन प्रारंभिक ExceptionInInitializerErrorकेवल एक परीक्षण मामले में होगा। पहला वह जो समस्याग्रस्त Exampleवर्ग का उपयोग करता है । अन्य परीक्षण मामले जो Exampleकक्षा का उपयोग करते हैं, वे सिर्फ फेंक देंगे NoClassDefFoundErrors


4
यह वास्तविक जीवन में सलाह का बहुत ही उपयोगी टुकड़ा है। मेरे पास क्लास की विशेषता शुरुआती के साथ एक ही स्थिति थी। आपके पास केवल एक बार लॉग में वास्तविक समस्या को देखने का मौका है। एक बार जब कक्षा लोड हो जाती है (या वैसे भी प्रयास किया जाता है) तो आपको सब कुछ पुनः आरंभ करने की आवश्यकता होती है।
DailyFrankPeter 14

4

नीचे दी गई तकनीक ने मुझे कई बार मदद की:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

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


3

यदि आपके पास जनरेट-कोड (EMF, आदि) है तो बहुत सारे स्टैटिक इनिशियलाइज़र हो सकते हैं जो सभी स्टैक स्पेस का उपभोग करते हैं।

स्टैक ओवरफ्लो प्रश्न देखें जावा स्टैक आकार कैसे बढ़ाएं?


"ईएमएफ" ? क्या आपका मतलब " MEF " है ?
पीटर मॉर्टेंसन

2
नहीं। एक्लिप्स मॉडलिंग फ्रेमवर्क के रूप में ईएमएफ। ऑटोमोटिव में हम उत्पन्न कोड को चलाते समय इस त्रुटि का सामना कर सकते हैं।
Aykut Kllic

1

मैंने सभी मॉड्यूल के लिए प्रीडेक्स लाइब्रेरी को अक्षम करके अपनी समस्या तय की:

dexOptions {
        preDexLibraries false
        ...

1

NoClassDefFoundErrorतब भी हो सकता है जब कोई स्थैतिक इनिलाइज़र एक संसाधन बंडल लोड करने का प्रयास करता है जो रनटाइम में उपलब्ध नहीं होता है, उदाहरण के लिए एक गुण फ़ाइल जिसे प्रभावित वर्ग META-INFनिर्देशिका से लोड करने का प्रयास करता है , लेकिन ऐसा नहीं है। यदि आप नहीं पकड़ते हैं NoClassDefFoundError, तो कभी-कभी आप पूर्ण स्टैक ट्रेस नहीं देख पाएंगे; इसे दूर करने के लिए आप अस्थायी रूप से एक catchक्लॉज का उपयोग कर सकते हैं Throwable:

try {
    // Statement(s) that cause the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}

यह गलत है। एक लापता संसाधन आपको यह त्रुटि नहीं देगा। यह आपको तभी मिलेगा जब कोई क्लास छूटी हो।
स्टीफन सी

@StephenC शायद मुझे उस हिस्से पर अधिक जोर देना चाहिए, लेकिन मैंने लिखा for example a properties file that the affected class tries to load from the META-INF directory। यह वास्तव में मेरे साथ हुआ है और मैं NoClassDefFoundErrorलापता गुण फ़ाइल को जोड़कर हल करने में सक्षम था । मैंने इस उत्तर को ठीक से जोड़ा क्योंकि कोई इस त्रुटि का उल्लेख परिस्थितियों में नहीं करेगा।

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

यदि मैं गलत हूं (अर्थात यह असफल staticआरंभीकरण के कारण नहीं है), तो मैं एक वास्तविक उदाहरण (यानी MCVE) देखना चाहूंगा जो व्यवहार को प्रदर्शित करता हो।
स्टीफन सी

1
@StephenC आप बिलकुल सही हैं, हालांकि :( मैंने उस मामले को देखा, जहां मुझे इस मुद्दे का सामना करना पड़ा और इसमें वास्तव में एक संसाधन को लोड करने की कोशिश करने वाला एक स्थिर इनिशियलाइज़र शामिल था। मैं कारण के बारे में अपना विवरण बढ़ाने / सुधारने का प्रयास करूंगा। बाहर।
ᴠɪɴᴄᴇɴᴛ

1

मुझे यह त्रुटि तब हुई जब मैं अपने प्रोजेक्ट में एक अन्य मॉड्यूल की मावेन निर्भरता को जोड़ता हूं, इस मुद्दे को अंततः -Xss2mमेरे कार्यक्रम के जेवीएम विकल्प (यह जेडीके 5.0 के बाद से डिफ़ॉल्ट रूप से एक मेगाबाइट है) में जोड़कर हल किया गया था । यह माना जाता है कि कार्यक्रम में कक्षा को लोड करने के लिए पर्याप्त स्टैक नहीं है।


0

यदि कोई java.lang.NoClassDefFoundError: org/apache/log4j/Loggerत्रुटि के कारण यहां आता है , तो मेरे मामले में इसका उत्पादन किया गया था क्योंकि मैंने log4j 2 का उपयोग किया था (लेकिन मैंने इसके साथ आने वाली सभी फ़ाइलों को नहीं जोड़ा था), और कुछ निर्भरता लाइब्रेरी ने log4j का उपयोग किया था। 1 समाधान Log4j को जोड़ने के लिए था 1.x ब्रिज: जार log4j-1.2-api-<version>.jarजो log4j के साथ आता है 2. log4j 2 माइग्रेशन में अधिक जानकारी ।


0

एक ही परियोजना की दो अलग-अलग चेकआउट प्रतियां

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

परियोजना की ट्रंक कॉपी को बंद करना और परीक्षण मामले को फिर से चलाने से समस्या से छुटकारा मिला।


0

यह त्रुटि अनियंत्रित जावा संस्करण आवश्यकताओं के कारण हो सकती है ।

मेरे मामले में मैं एसडीकेमैन का उपयोग करके जावा 9 से जावा 8 पर स्विच करके, एक हाई-प्रोफाइल ओपन-सोर्स प्रोजेक्ट का निर्माण करते हुए, इस त्रुटि को हल करने में सक्षम था !

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

फिर नीचे वर्णित के रूप में एक साफ स्थापित कर रहा है।


अपने निर्माण उपकरण के रूप में मावेन का उपयोग करते समय , यह कभी-कभी मददगार होता है - और आम तौर पर संतुष्टिदायक, एक साफ 'इंस्टॉल' निर्माण करने के लिए परीक्षण अक्षम के साथ

mvn clean install -DskipTests

अब जब सब कुछ बनाया और स्थापित किया गया है, तो आप आगे बढ़ सकते हैं और परीक्षण चला सकते हैं।

mvn test

0

जब मुझे मेरे प्रोजेक्ट के जावा बिल्ड पाथ में "ऑर्डर और एक्सपोर्ट" टैब पर एक क्लास निर्यात नहीं किया गया तो मुझे NoClassDefFound त्रुटियाँ मिलीं। प्रोजेक्ट के निर्माण पथ में आपके द्वारा जोड़ी गई किसी भी निर्भरता के "ऑर्डर और निर्यात" टैब में एक चेकमार्क डालना सुनिश्चित करें। ग्रहण चेतावनी देखें : XXXXXXXXXXXXX.jar को निर्यात या प्रकाशित नहीं किया जाएगा। रनटाइम ClassNotFoundException परिणाम हो सकता है


0

यह इसलिए भी हो सकता है क्योंकि आप एक निश्चित पैकेज नाम के साथ IDE से कोड फ़ाइल की प्रतिलिपि बनाते हैं और आप टर्मिनल का उपयोग करके इसे चलाने का प्रयास करना चाहते हैं। आपको पहले कोड से पैकेज का नाम निकालना होगा। मेरे साथ ऐसा होता है।


0

मेरे मामले में मुझे यह त्रुटि JDK संस्करणों में एक बेमेल के कारण मिल रही थी। जब मैंने Intelij से एप्लिकेशन को चलाने की कोशिश की तो यह काम नहीं कर रहा था लेकिन फिर कमांड लाइन से इसे चलाने पर काम हुआ। ऐसा इसलिए है क्योंकि Intelij इसे Java 11 JDK के साथ चलाने का प्रयास कर रहा था जो सेटअप था लेकिन कमांड लाइन पर यह Java 8 JDK के साथ चल रहा था। फ़ाइल> प्रोजेक्ट स्ट्रक्चर> प्रोजेक्ट सेटिंग्स> प्रोजेक्ट एसडीके के तहत उस सेटिंग को स्विच करने के बाद, इसने मेरे लिए काम किया।


0

हर कोई यहाँ कुछ जावा विन्यास सामान, जेवीएम समस्याओं आदि के बारे में बात करता है, मेरे मामले में त्रुटि इन विषयों से संबंधित नहीं थी और कारण को हल करने के लिए बहुत तुच्छ और आसान था: मेरे नियंत्रक में मेरे समापन बिंदु पर एक गलत टिप्पणी थी ( स्प्रिंग बूट आवेदन)।


0

मुझे लिबर्टी सर्वर के साथ काम करने वाले JavaEE में NoClassDefFoundError के साथ एक दिलचस्प मुद्दा मिला है। मैं IMS संसाधन एडेप्टर का उपयोग कर रहा था और मेरे सर्वर.xml में पहले से ही imsudbJXA.rar के लिए संसाधन एडॉप्टर था। जब मैंने imsudbXA.rar के लिए नया एडेप्टर जोड़ा, तो मुझे यह त्रुटि DLIException, IMSConnectionSpec या SQLInteractionSpec के लिए ऑब्जेक्ट ऑब्जेक्ट के लिए मिलनी शुरू हो जाएगी। मैं समझ नहीं पाया कि मैंने केवल imsudbXA.rar का उपयोग करके अपने काम के लिए नया सर्वर.xml बनाकर इसे हल क्यों किया। मुझे यकीन है कि server.xml में कई संसाधन एडेप्टर का उपयोग करना ठीक है, मेरे पास उस पर गौर करने का कोई समय नहीं था।


-1

जावा को रनटाइम में क्लास ए नहीं मिल रहा था। क्लास ए एक अलग कार्यक्षेत्र से मावेन प्रोजेक्ट आर्टक्लाइंट में था। इसलिए मैंने अपने ग्रहण प्रोजेक्ट में ArtClient को आयात किया। मेरी दो परियोजनाएं ArtClient का उपयोग निर्भरता के रूप में कर रही थीं। मैंने इन लोगों के लिए प्रोजेक्ट रेफरेंस में लाइब्रेरी रेफरेंस (बिल्ड पाथ -> कॉन्फिगर बिल्ड पाथ) को बदल दिया।

और समस्या दूर हो गई।


-1

मुझे वही समस्या थी, और मैं कई घंटों तक स्टॉक था।

मुझे इसका हल मिल गया। मेरे मामले में, स्थैतिक विधि की वजह से परिभाषित किया गया था। JVM उस वर्ग की दूसरी वस्तु नहीं बना सकता है।

उदाहरण के लिए,

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");

-6

मुझे यह संदेश SRC लाइब्रेरी से दो फ़ाइलों को हटाने के बाद मिला है, और जब मैं उन्हें वापस लाया तो मैं इस त्रुटि संदेश को देखता रहा।

मेरा समाधान था: ग्रहण को फिर से शुरू करना। तब से मैंने यह संदेश दोबारा नहीं देखा है :-)


4
यह सबसे अधिक वोट किए गए उत्तर द्वारा समझाया गया है, जब आपने पहली बार संकलित किया था, तो फाइलें थीं, तब आपने कुछ फाइलें हटा दी थीं, कक्षाएं हटा दी गई थीं, इसलिए रनटाइम पर, आपको क्लासनॉटफाउंड मिला, फिर आपने उन्हें वापस भेज दिया, लेकिन फिर भी ग्रहण नहीं हुआ। ध्यान दें कि उत्पन्न कक्षाएं अभी भी गायब थीं, लेकिन जब आप ग्रहण को फिर से शुरू करते हैं, तो कार्यक्षेत्र फिर से ताज़ा हो जाता है और कक्षाएं फिर से उपलब्ध होती हैं, लेकिन सामान्य तौर पर यह कोई समाधान या समाधान नहीं है, यह समाधान मिल रहा है कि रनटाइम में कौन सा वर्ग / जार गायब है। classpath।
जोस मैनुअल गोमेज़ अल्वारेज़

-7

यह सुनिश्चित करें कि यह module:appऔर module:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }

3
इस आम समस्या के लिए किसी भी तरह से आपका समाधान कैसे प्रासंगिक है?
तावी इल्वेस

नमूना विन्यास संतुलित नहीं है (तीन {sऔर दो })। क्या आप इसे ठीक कर सकते हैं?
पीटर मॉर्टेंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.