Java.lang.NoClassDefFoundError कैसे हल करें?


221

मैंने ओरेकल के जावा ट्यूटोरियल्स में दोनों उदाहरण की कोशिश की है । वे दोनों ठीक संकलन करते हैं, लेकिन रन-टाइम पर, दोनों इस त्रुटि के साथ आते हैं:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

मुझे लगता है कि मेरे पास Main.javaफ़ाइल गलत फ़ोल्डर में हो सकती है । यहाँ निर्देशिका पदानुक्रम है:

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

और यहाँ है Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

मुझसे यहां क्या गलत हो रहा है?

अपडेट करें

जब मैंने Mainकक्षा को graphicsपैकेज में डाला (मैंने package graphics;इसे जोड़ा ), तो क्लासपैथ को "_test" (ग्राफिक्स युक्त फ़ोल्डर) सेट करें, इसे संकलित किया, और इसे java graphics.Main(कमांड लाइन से) का उपयोग करके चलाया ।

वास्तव में देर से अद्यतन # 2

मैं एक्लिप्स (सिर्फ नोटपैड ++ और जेडीके) का उपयोग नहीं कर रहा था, और उपरोक्त अपडेट से मेरी समस्या हल हो गई। हालांकि, ऐसा लगता है कि इनमें से कई उत्तर एक्लिप्स और इंटेलीज के लिए हैं, लेकिन उनकी समान अवधारणाएं हैं।


1
अपने मुख्य वर्ग को देखते हुए, यह एक पैकेज में नहीं है (आप package graphics;शीर्ष पर होगा )। है graphicsअपने पैकेज संरचना के सिर? क्या स्क्वायर package graphics.shapesशीर्ष पर है?
लालची

1
आप यह सूचीबद्ध कर रहे हैं कि .java फाइलें कहां हैं, लेकिन चूंकि आप जो प्राप्त कर रहे हैं वह एक रनटाइम इशू है, आप वास्तव में जिस चीज में रुचि रखते हैं, वह कहां है .class फाइलें हैं और वे आपके वर्गपथ पर हैं या नहीं। आप मुख्य वर्ग को कैसे निष्पादित कर रहे हैं?
Thor84no

ग्रहण में शिफ्ट + ctrl + o को हिट करने के लिए अपने आयातों को व्यवस्थित करें
Happybuddha

सुनिश्चित करें कि आप कक्षा का नाम सही प्रकार से लिखें। मुझे यह त्रुटि हो रही थी क्योंकि मैंने कक्षा का नाम ऊपरी मामले के पत्र के साथ शुरू नहीं किया था
जेरेमी बोर्ग

यह कभी-कभी इंटेलीजे आईडिया में एक बड़ी रिफैक्टिंग के बाद होता है। अपनी परियोजना पर राइट क्लिक करें और चुनें -> संकलन मॉड्यूल , और फिर परियोजना को फिर से शुरू करें और इसे फिर से काम करना चाहिए।
ज़ार

जवाबों:


223

अपना कोड संकलित करने के बाद, आप .classअपने प्रोग्राम की प्रत्येक कक्षा के लिए फाइलों के साथ अंत करते हैं। ये बाइनरी फाइलें बाइटकोड हैं जो जावा आपके प्रोग्राम को निष्पादित करने के लिए व्याख्या करता है। NoClassDefFoundErrorइंगित करता है कि classloader (इस मामले में java.net.URLClassLoader) है, जो गतिशील रूप से लोड हो रहा है वर्गों के लिए जिम्मेदार है, नहीं मिल रहा है .classवर्ग है कि आप का उपयोग करने के लिए कोशिश कर रहे हैं फ़ाइल।

यदि आवश्यक कक्षाएं मौजूद नहीं थीं, तो आपका कोड संकलित नहीं करेगा (जब तक कि कक्षाओं को प्रतिबिंब के साथ लोड नहीं किया जाता है), इसलिए आमतौर पर इस अपवाद का मतलब है कि आपके वर्गपथ में आवश्यक कक्षाएं शामिल नहीं हैं। याद रखें कि java.net.URLClassLoaderक्लास लोडर (विशेष रूप से ) आपके क्लासथ में प्रत्येक प्रविष्टि में फ़ोल्डर ए / बी / सी / पैकेज एबीसी में कक्षाओं के लिए दिखेगा। NoClassDefFoundErrorयह भी संकेत कर सकता है कि आप एक .jar फ़ाइल की सकर्मक निर्भरता को याद कर रहे हैं जिसे आपने संकलित किया है और आप उपयोग करने का प्रयास कर रहे हैं।

उदाहरण के लिए, यदि आपके पास एक कक्षा है com.example.Foo, तो संकलन करने के बाद आपके पास एक क्लास फ़ाइल होगी Foo.class। उदाहरण के लिए कहें कि आपकी वर्किंग डायरेक्टरी है .../project/। उस वर्ग फ़ाइल को अंदर रखा जाना चाहिए .../project/com/example, और आप अपनी कक्षा को निर्धारित करेंगे .../project/

साइड नोट: मैं जावा और जेवीएम भाषाओं के लिए मौजूद अद्भुत टूलिंग का लाभ उठाने की सलाह दूंगा। आधुनिक IDE जैसे ग्रहण और IDEA और Maven या Gradle जैसे प्रबंधन उपकरण बनाने से आपको क्लासपैथ (अधिक) के बारे में चिंता करने और कोड पर ध्यान केंद्रित करने में मदद नहीं मिलेगी! उस ने कहा, यह लिंक बताता है कि जब आप कमांड लाइन पर निष्पादित करते हैं तो क्लासपाथ कैसे सेट करें।


एंड्रॉइड पर यूनिट टेस्ट चलाने की कोशिश के दौरान आई एक त्रुटि के कारण मैं इसे पढ़ रहा हूं। यह पता चला है कि मेरे मामले में, NoClassDefFoundError, परीक्षण में गुम निर्भरता के परिणामस्वरूप हुई। मुझे इस तरह की त्रुटियों को रोकने के लिए निर्भरता इंजेक्शन के बारे में सोचने की आवश्यकता है। विस्तृत जवाब के लिए धन्यवाद।
ठेठ डैनी

130

मैं दूसरों के दृष्टिकोण को सही करना चाहूंगा NoClassDefFoundError

NoClassDefFoundError जैसे कई कारणों से हो सकता है

  1. ClassNotFoundException - .class उस संदर्भित क्लास के लिए नहीं मिली, भले ही वह संकलन समय पर उपलब्ध हो या नहीं (यानी आधार / चाइल्ड क्लास)।
  2. क्लास फ़ाइल स्थित है, लेकिन स्टैटिक वैरिएबल को इनिशियलाइज़ करते हुए एक्सेप्शन उठाया गया है
  3. क्लास फ़ाइल स्थित, अपवाद स्थिर ब्लॉकों को प्रारंभ करते समय उठाया गया

मूल प्रश्न में, यह पहला मामला था जिसे संदर्भित कक्षा जार फ़ाइल या इसके पैकेज फ़ोल्डर में CLASSPATH सेट करके ठीक किया जा सकता है।

"संकलन समय में उपलब्ध" कहने का क्या अर्थ है?

  • संदर्भित वर्ग कोड में उपयोग किया जाता है।
    जैसे: दो वर्ग, ए और बी (ए का विस्तार)। यदि B को कोड में सीधे संदर्भित किया जाता है, तो यह संकलन समय पर उपलब्ध है, अर्थात A = new B ();

"संकलन समय पर उपलब्ध नहीं" कहने का क्या अर्थ है?

  • संकलित समय वर्ग और रनटाइम क्लास अलग-अलग हैं, उदाहरण के लिए बेस क्लास को क्लास क्लास के लिए बच्चे के क्लासनाम का उपयोग करके लोड किया जाता है उदाहरण के लिए Class.forName ("क्लासनाम")
    जैसे: दो कक्षाएं, ए और बी (ए का विस्तार)। कोड में
    A = Class.forName ("B") है। newInstance ();

मेरे मामले में, मैंने एक वर्ग संकलित किया था, उन्होंने इसे ऐप नामक एक निर्देशिका में स्थानांतरित किया। package app;इससे पहले कि मैं इसे सबडायरेक्ट ऐप में स्थानांतरित कर पाऊं, मुझे एक लाइन जोड़ना होगा और फिर से जोड़ना होगा ।
taco

1
सूचीबद्ध 3 से ऊपर के अलावा, ClassLoaders भी ऐसी त्रुटि का कारण हो सकता है, जो मूल रूप से ClassNotFoundException है, इस परिदृश्य में कक्षा Classpath में मौजूद हो सकती है लेकिन विभिन्न ClassLoader से लोड करने का प्रयास
Fahad

2 और 3 क्लास-लोडर-विशिष्ट हैं। जावदोक के अनुसार, अपवाद केवल 1 कारण से है।
शमूएल

1
मैंने केस 2 और केस 3 का परीक्षण किया है, यह 'NoClassDefFoundError नहीं है, यह ExceptionInInitializerError Case 2.Class फ़ाइल स्थित है, लेकिन स्थैतिक चर को प्रारंभ करते समय अपवाद उठाया गया। Case 3.Class फ़ाइल स्थित है, स्थैतिक ब्लॉक को प्रारंभ करते समय अपवाद उठाया गया है
Michael

1
@Michael, इस लिंक का कहना है कि अपने स्टैकट्रेस भी प्रदर्शित करेगा NoClassDefFoundErrorकि मामले के लिए: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier

15

NoClassDefFoundErrorइसका मतलब यह है कि वर्ग में कक्षा में मौजूद है Compile time, लेकिन यह कक्षा में मौजूद नहीं है Runtime

आप ग्रहण का उपयोग कर रहे हैं, तो आप है यह सुनिश्चित कर लें shapes, linepointsऔर spaceobjectsमें प्रविष्टियों के रूप .classpathफ़ाइल।


1
कोशिश / पकड़ने के माध्यम से रनटाइम में कैसे संभालें ?
मेवेद M

5
यह उत्तर आपके लिखने के तरीके के बारे में सही नहीं है। सही होगा: "इस त्रुटि का एक संभावित कारण है ...." लेकिन ऐसे अन्य कारण भी हो सकते हैं कि जब क्लास लोडर के साथ रनटाइम पर JAR फ़ाइल लोड करते समय आपको यह त्रुटि मिलती है।
एल्म्यू

13

यदि आपको संकलन करते और दौड़ते समय इनमें से कोई एक त्रुटि मिली:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- समाधान -----------------------

समस्या ज्यादातर संकुल संगठन में है। आपको अपने स्रोत कोड में पैकेज वर्गीकरण के संबंध में अपनी कक्षाओं को फ़ोल्डर्स में ठीक से व्यवस्थित करना चाहिए।

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

"-D।" javac कमांड में ट्रिक करता है, रूट डायरेक्टरी पर सभी .class फाइल्स को डालने के बजाय पैकेज के फोल्डर स्ट्रक्चर को बनाते है, धन्यवाद!
जॉर्ज संपोय

9
java.lang.NoClassDefFoundError

इंगित करता है, कि कुछ पर मिला था compiletime लेकिन कम से नहीं क्रम । शायद आपको इसे क्लासपाथ में जोड़ना होगा।


15
उसको कैसे करे?
नरेन्द्र सिंह

उस संदर्भ पर निर्भर करता है जिसे आप पूछ रहे हैं।
sschrass 10

6

कोई वर्ग परिभाषा अपवाद तब उत्पन्न होती है जब इच्छित वर्ग को कक्षा पथ में नहीं मिलता है। कंपाइल टाइम क्लास में: जावा कंपाइलर से क्लास जेनरेट की जाती थी, लेकिन रन टाइम पर किसी तरह डिपेंडेंट क्लास नहीं मिलती।

चलो एक सरल उदाहरण के माध्यम से जाना:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

अब मान लेते हैं कि ऊपर के दो जावा सोर्स कोड कुछ फोल्डर में रखे गए हैं जो कहते हैं "NoClassDefinationFoundExceptionDoo"

अब एक खोल खोलें (मान लें कि जावा पहले से ही सही तरीके से सेटअप हो रहा है)

  1. फ़ोल्डर पर जाएं "NoClassDefinationFoundExceptionDemo"
  2. संकलित जावा स्रोत फ़ाइलें javac ClassB javac ClassA
  3. दोनों फ़ाइलों को संकलित रूप से संकलित किया गया है और कक्षा फ़ाइलों को ClassA.class और ClassB.class के समान फ़ोल्डर में जनरेट किया गया है
  4. अब चूँकि हम ClassPath को वर्तमान वर्किंग डाइरेक्टरी में ओवरराइड कर रहे हैं इसलिए हम निम्नलिखित कमांड java -cp को निष्पादित करते हैं ClassA और It ने सफलतापूर्वक काम किया और आपको आउटपुट स्क्रीन में दिखाई देगा
  5. अब कहते हैं, आपने ClassB.class फ़ाइल को Present Directory से हटा दिया है। और अब आप फिर से कमांड निष्पादित करते हैं। java -cp ClassA अब यह आपको NoClassDefFoundException के साथ अभिवादन करेगा। ClassB के रूप में ClassA के लिए निर्भरता Classpath (अर्थात वर्तमान कार्यशील निर्देशिका) में नहीं मिली है।

5

जावा में NoClassDefFoundError:

परिभाषा:

NoClassDefFoundError संकलित समय के दौरान एक वर्ग मौजूद था, लेकिन रनवा के दौरान java classpath में उपलब्ध नहीं है, तो आ जाएगा। जब आप NoClassDefFoundError प्राप्त करते हैं तो आम तौर पर आप लॉग इन लाइन के नीचे देखेंगे: थ्रेड में मुख्य "java.lang.NoClassDefFoundError"

संभावित कारण:

  1. जावा क्लासपाथ में कक्षा उपलब्ध नहीं है।

  2. आप जार कमांड का उपयोग करके अपना प्रोग्राम चला रहे होंगे और क्लास को प्रकट फ़ाइल के क्लासपैथ विशेषता में परिभाषित नहीं किया गया था।

  3. कोई भी स्टार्ट-अप स्क्रिप्ट Classpath पर्यावरण चर को ओवरराइड कर रहा है।

  4. क्योंकि NoClassDefFoundError java.lang.LinkageError का एक उपवर्ग है, तो यह भी आ सकता है यदि इसमें से कोई एक निर्भरता जैसे कि मूल लाइब्रेरी उपलब्ध न हो।

  5. अपनी लॉग फ़ाइल में java.lang.ExceptionInInitializerError की जाँच करें। स्थैतिक आरंभीकरण की विफलता के कारण NoClassDefFoundError काफी आम है।

  6. यदि आप एकाधिक क्लास लोडर के बीच कक्षा की दृश्यता की तुलना में J2EE वातावरण में काम कर रहे हैं, तो java.lang.NoClassDefFoundError भी हो सकता है, विस्तृत चर्चा के लिए उदाहरण और परिदृश्य अनुभाग देखें।

संभव संकल्प:

  1. सत्यापित करें कि सभी आवश्यक जावा कक्षाएं एप्लिकेशन के क्लासपाथ में शामिल हैं। सबसे आम गलती सभी आवश्यक वर्गों को शामिल करना नहीं है, एक जावा एप्लिकेशन को निष्पादित करने से पहले शुरू करना जो कुछ बाहरी पुस्तकालयों पर निर्भरताएं हैं।

  2. एप्लिकेशन का क्लासपाथ सही है, लेकिन क्लासपैथ पर्यावरण चर को एप्लिकेशन के निष्पादन से पहले ओवरराइड किया जाता है।

  3. सत्यापित करें कि आपके अनुप्रयोग के स्टैक ट्रेस में पूर्वोक्त ExceptionInInitializerError प्रकट नहीं होता है।

संसाधन:

जावा J2EE में java.lang.NoClassDefFoundError को हल करने के 3 तरीके

java.lang.NoClassDefFoundError - No Class Def Found मिली Error को कैसे हल करें


3

यदि आपका प्रोजेक्ट जैसे पैकेज में है com.blahcodeऔर आपकी कक्षा को बुलाया जाता है Main, तो संकलित फाइलें जैसे निर्देशिका संरचना में आउटपुट हो सकती हैं ./out/com/blahcode/Main.class। यह IntelliJ IDEA के लिए विशेष रूप से सच है।

जब किसी शेल या cmd से चलने की कोशिश की जा रही है, तो आपको cdउस की आवश्यकता होती है, जिसमें comएक उप-निर्देशिका होती है।

cd out
java -classpath . com.blahcode.Main

1

कई महीनों तक नेटबीन्स परियोजना पर काम करने के बाद, मुझे "लो मेमोरी" अलर्ट मिलने के तुरंत बाद अचानक NoClassDefFoundError संदेश मिला। स्वच्छ पुनर्निर्माण करने से कोई मदद नहीं मिली, लेकिन नेटबीन्स को पूरी तरह से बंद करना और परियोजना को फिर से खोलना कोई त्रुटि रिपोर्ट नहीं थी।


1

यह उत्तर एक java.lang.NoClassDefFoundError के लिए विशिष्ट है जो एक सेवा में हो रहा है :

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

हालांकि, जब जांच की गई, तो जो वर्ग नहीं मिला था, वह स्टैक ट्रेस में कई वर्गों के समान मॉड्यूल में था। इसके अलावा, यह एक मॉड्यूल नहीं था जिसे केवल हाल ही में निर्माण में जोड़ा गया था। इन तथ्यों ने संकेत दिया कि यह मावेन निर्भरता मुद्दा नहीं हो सकता है।

अंतिम समाधान: सेवा को पुनरारंभ करें!

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

आशा है कि विशिष्ट मामला किसी की मदद करता है।


1

मैंने आज समस्या का सामना किया है। मेरे पास एक एंड्रॉइड प्रोजेक्ट है और सक्षम करने multidexके बाद प्रोजेक्ट अब शुरू नहीं होगा।

कारण यह था कि मैं उस विशिष्ट मल्टीडेक्स पद्धति को कॉल करना भूल गया था जिसे Application classहर चीज से पहले जोड़ा जाना चाहिए ।

 MultiDex.install(this);

मल्टीडेक्स को सही ढंग से सक्षम करने के लिए इस ट्यूटोरियल का पालन करें। https://developer.android.com/studio/build/multidex.html

आपको इन लाइनों को अपने एप्लिकेशन वर्ग में जोड़ना चाहिए

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

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

आशा है कि यह किसी के साथ एक परिचित मुद्दे के रूप में मेरी मदद कर सकता है, जिसने यह वही त्रुटि संदेश उत्पन्न किया।


0

इस श्रृंखला में मेरे दो सेंट:

सुनिश्चित करें कि क्लासपैथ में पूर्ण पथ (के /home/user/lib/some_lib.jarबजाय ~/lib/some_lib.jar) हैं अन्यथा आप अभी भी NoClassDefFoundErrorत्रुटि का सामना कर सकते हैं ।


यह भाग में सच है, लेकिन यह अधिक जटिल है। 1) आप क्लासपाथ में रिश्तेदार रास्तों का उपयोग कर सकते हैं, लेकिन उन्हें JVM द्वारा resolvable होना चाहिए ... JVM की वर्तमान निर्देशिका के सापेक्ष। यह उन्हें नाजुक बनाता है । 2) आप एक क्लासपैथ पर्यावरण चर सेट करते समय अन्य मेटा मेटा वर्णों का उपयोग कर सकते हैं ~, लेकिन केवल वही तंत्र प्रदान करते हैं जिसे आप चर सेट करने के लिए उपयोग कर रहे हैं उन्हें वास्तविक पथनाम में विस्तारित करता है। यदि आप उपयोग कर रहे हैं bash, तो आप "मिश्रित" परिणाम प्राप्त कर सकते हैं। उदाहरण के लिए, echo ~:~कमांड लाइन पर टाइप करने पर आपको जो मिलता है, उसे देखें । पहले ~का विस्तार किया गया है, लेकिन दूसरा नहीं है।
स्टीफन सी

0

मुझे NoClassFoundError मिलता है जब रनटाइम क्लास लोडर द्वारा लोड की गई कक्षाएं java रूट लोडर द्वारा पहले से लोड की गई कक्षाओं तक नहीं पहुंच सकती हैं। क्योंकि अलग-अलग श्रेणी लोडर अलग-अलग सुरक्षा डोमेन (जावा के अनुसार) में होते हैं, 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;
            }
        });
    }
}

0

यह एंड्रॉइड स्टूडियो में मेरे साथ हुआ।

मेरे लिए काम किया समाधान: बस स्टूडियो को पुनरारंभ करें।


0

एंड्रॉइड स्टूडियो का उपयोग करके मेरे एंड्रॉइड विकास के साथ मेरे पास एक ही मुद्दा था। प्रदान किए गए समाधान सामान्य हैं और मेरी मदद नहीं की (कम से कम मेरे लिए)। घंटों के अनुसंधान के बाद मुझे निम्नलिखित समाधान मिला और उन Android डेवलपर्स को मदद मिल सकती है जो android स्टूडियो का उपयोग करके विकास कर रहे हैं। प्राथमिकता के नीचे सेटिंग को संशोधित करें -> बिल्ड, एक्ज़ीक्यूशन, परिनियोजन -> इंस्टेंट रन -> पहले विकल्प को अन-चेक करें।

इस बदलाव के साथ मैं ऊपर चल रहा हूं। आशा है कि यह मेरे देव मित्रों की मदद करेगा।


0

इस अपवाद के लिए त्रुटि का एक स्रोत प्रागार्ड के लिए असंगत परिभाषाओं से उपजा हो सकता है, उदाहरण के लिए एक लापता

-LibraryJars "path.to.a.missing.jar.library"।

यह बताता है कि क्यों संकलन और रनिंग ठीक काम करता है, यह देखते हुए कि जार वहाँ है, जबकि साफ और निर्माण विफल रहता है। गार्ड सेटअप में नए जोड़े गए जार पुस्तकालयों को परिभाषित करना याद रखें!

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

जाहिर है, NoClassDefFound अपवाद तब परिणामित होगा जब उदाहरण के लिए बनाया गया परिणामी निष्पादन योग्य जार निर्मित और प्रागेन संगति की कमी के आधार पर। कुछ लोग इसे "नर्क" कहते हैं


0

मैं ग्रहण के लिए FileSync प्लगइन का उपयोग करता हूं, इसलिए मैं टॉमकैट पर डिबग कर सकता हूं और मुझे प्राप्त हुआ NoClassFoundErrorक्योंकि मैंने टॉमकैट के लिए ग्रहणbin कार्यक्षेत्र => classesमें निर्देशिका के लिए एक सिंक प्रविष्टि metadataजोड़ी थी, लेकिन extlibग्रहण में निर्देशिका के लिए एक फ़ोल्डर सिंक भी नहीं जोड़ा था=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

मैं एक RCP (रिच क्लाइंट प्लेटफ़ॉर्म) के रूप में जाना जाने वाला एक ग्रहण आधारित अनुप्रयोग विकसित कर रहा हूँ । और मैं इस समस्या का सामना करने के बाद (प्लग इन से एक वर्ग को एक नए सिरे से स्थानांतरित करने) कर रहा हूं।

परियोजना की सफाई और मावेन अपडेट से कोई मदद नहीं मिली।

समस्या बंडल-एक्टीवेटर के कारण हुई थी जिसे स्वचालित रूप से अपडेट नहीं किया गया है। नए प्लगइन में MANIFEST.MF के तहत बंडल-एक्टीवेटर के मैनुअल अपडेट ने मेरी समस्या को ठीक कर दिया है।


0

अगर आपने हाल ही में एंड्राइड स्टूडियो में मल्टीडेक्स सपोर्ट को इस तरह जोड़ा है:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

इसलिए आपका समाधान केवल अनुप्रयोग के बजाय मल्टीडेक्स्पेक्शन से विस्तारित है

public class MyApp extends MultiDexApplication {

0

यदि आप एक से अधिक मॉड्यूल का उपयोग कर रहे हैं, तो आपके पास होना चाहिए

dexOptions {
    preDexLibraries = false
}

अपनी बिल्ड फ़ाइल में।


0

जांचें कि यदि आपके पास अपनी कक्षा में एक स्थिर हैंडलर है। यदि ऐसा है, तो कृपया सावधान रहें, क्योंकि स्थैतिक हैंडलर केवल उसी थ्रेड में शुरू किया जा सकता है जिसमें एक लूपर है, दुर्घटना को इस तरह से ट्रिगर किया जा सकता है:

1. पूरी तरह से, एक साधारण धागे में कक्षा का उदाहरण बनाएं और दुर्घटना को पकड़ लें।

2. फिर क्लास के फील्ड मेथड को मेन थ्रेड में कॉल करें, आपको NoClassDefFoundError मिलेगा।

यहाँ परीक्षण कोड है:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

मुख्य गतिविधि के अपने onCrete विधि में, परीक्षण कोड भाग जोड़ें:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

एक हैंडलर का उपयोग करके इसे ठीक करने का एक सरल तरीका है, थ्रेड हैंडलर का उपयोग करें:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

मॉड्यूल के बाहर परीक्षण कक्षाओं का उपयोग न करें

मेरे पास समाधान नहीं है, "संकलन में मौजूद एक और स्वाद, रन टाइम में अनुपस्थित" मामला।

मैं एक अन्य परीक्षण वर्ग से एक JUnit परीक्षण वर्ग से एक बहुत सुविधाजनक विधि का उपयोग करने की कोशिश कर रहा था जो एक अलग मॉड्यूल में रहता है। यह एक नहीं-नहीं है, क्योंकि परीक्षण कोड पैक किए गए जार का हिस्सा नहीं है, लेकिन मुझे एहसास नहीं हुआ क्योंकि यह ग्रहण के भीतर से उपयोगकर्ता वर्ग के लिए दिखाई देता है।

मेरा समाधान विधि को मौजूदा उपयोगिताओं वर्ग में रखने का था जो उत्पादन कोड का हिस्सा है।


0

मेरे वातावरण में, मैं यूनिट टेस्ट में इस मुद्दे का सामना करता हूं। एक पुस्तकालय निर्भरता को * .pom पर लागू करने के बाद, यह तय हो गया है।

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

त्रुटि संदेश:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

पोम:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

मुझे यह त्रुटि एक Git शाखा बदलने के बाद मिली। ग्रहण के विशिष्ट मामले के लिए, org.eclipse.wst.common.component फ़ाइल के लिए .settings निर्देशिका पर गलत लाइनें थीं। जैसा कि आप नीचे देख सकते हैं

मावेन इंस्टॉल के साथ परियोजना निर्भरता को बहाल करने में मदद मिलेगी।

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


0

यदि आप उपयोग कर रहे हैं gradlew, तो जाएँ ./gradle/wrapper/gradle-wrapper.propertiesऔर distributionUrlग्रेडेल के सही संस्करण में बदलें ।

अगर आप JDK14 ट्राय कर रहे हैं

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

-1

यह मेरे जीनोमेशन उपकरणों के साथ बहुत कुछ होता है। सुनिश्चित करें कि आपके पास आपके ड्राइव पर अच्छी मात्रा में मेमोरी उपलब्ध है जहाँ Genymotion स्थापित है।


क्या आपके पास इसके लिए कोई संदर्भ है?
वाई हा ली

नहीं, मैं सिर्फ नियमित रूप से डिस्क स्थान से बाहर चलाता हूं और जब तक मैं एक अच्छी राशि को हटा नहीं देता / हटा देता हूं / मैं एक त्रुटि उत्पन्न करता हूं एक जीनोमिशन वर्चुअल डिवाइस को पुनर्स्थापित करता हूं।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.