मैं ClassNotFoundException को कैसे हल करूं?


106

मैं जावा एप्लिकेशन चलाने की कोशिश कर रहा हूं, लेकिन यह त्रुटि हो रही है:

java.lang.ClassNotFoundException:

बृहदान्त्र के बाद वर्ग का स्थान आता है जो गायब है। हालाँकि, मुझे पता है कि वह स्थान मौजूद नहीं है क्योंकि कक्षा कहीं और स्थित है। मैं उस वर्ग के पथ को कैसे अपडेट कर सकता हूं? क्या यह वर्ग पथ के साथ कुछ करना है?


1
आपको जार को जोड़ना होगा जो वर्ग के लिए लापता वर्ग है
क्रॉम

अगर आपकी कक्षा में एक पैकेज है तो उस फ़ोल्डर में जाएं जिसमें कक्षा है। जैसे अगर पैकेज पैकेज टेस्ट है। एबीसी, तो परीक्षण से पहले फ़ोल्डर पर जाएं और फिर जावा-सीपीपी करें। test.abc.CLASSNAME (बिना .class)। अगर कोई पैकेज नहीं है, तो क्लास वाले फ़ोल्डर में जाएं और जावा-सीपीपी कहें। CLASSNAME
वैकल्पिक

या तो आपके रनटाइम के लिए एक क्लास तैनात नहीं किया गया था (उदाहरण के लिए जार लापता), या क्लास किसी दिए गए क्लास लोडर में दिखाई नहीं दे रहा है, इस उपकरण की जाँच करें जो इन समस्याओं का निवारण करने में मदद करता है: jhades.org
Angular University

1
मैं भी इसमें कभी-कभी दौड़ता हूं। यह अपवाद अपवाद संदेश में सभी आवश्यक संदर्भ को बताते हुए नियम का स्पष्ट रूप से उल्लंघन करता है। यह उल्लेख करना चाहिए कि इसने इस चीज की तलाश करने की कोशिश की कि आपके क्लासपाथ पर क्या है। कृपया बेहतर अपवाद संदेश दें। हमें जानकारी के लिए शिकार न करें जो समस्या को हल करने में मदद कर सके।
मास्टरएक्सिलो

जवाबों:


32

आपका क्लासपाथ टूट गया है (जो जावा दुनिया में एक बहुत ही आम समस्या है)।

आप अपना आवेदन कैसे शुरू करते हैं, इसके आधार पर, आपको तर्क को संशोधित करने की आवश्यकता है -cp, MANIFEST.MF या आपके डिस्क लेआउट में आपकी कक्षा-पथ प्रविष्टि।


34
क्या आप कृपया अधिक विशिष्ट ग्रहण कर सकते हैं? मुझे क्या करना होगा?
user2426316

24
अधिक विशिष्ट उत्तर देने के लिए आपके प्रश्न में पर्याप्त जानकारी नहीं है। उसको जोड़ने पर विचार करें।
थोरबजर्न रावन एंडरसन

मूल रूप से सभी प्रोग्रामिंग वातावरणों में निर्भरता संकल्प / संस्करण बेमेल एक बहुत ही आम समस्या है। हम कह सकते हैं कि अब तक का कोई भी कार्यक्रम ऐसी परिभाषाओं को हल करता है ... सवाल हमेशा यह है कि परिभाषा क्या है / आप किस संस्करण का मतलब है?
मास्टरएक्सिलो

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

@ मास्टरएक्सिलो हाँ, लेकिन यह जरूरी नहीं कि यहाँ समस्या है और आप गलत पेड़ को काट सकते हैं। बस इतना ही कहा जा सकता है कि वर्गपथ टूट गया है।
थोर्बोजर्न रेवन एंडरसन

45

एक वर्गपथ, कक्षाओं को लोड करने के लिए स्थानों की एक सूची है।

ये 'स्थान' या तो निर्देशिकाएं, या जार फाइलें हो सकती हैं।

निर्देशिकाओं के लिए, जेवीएम एक कक्षा को लोड करने के लिए एक अपेक्षित पैटर्न का पालन करेगा। यदि मेरे पास मेरी सीपाथ में निर्देशिका C: / myproject / कक्षाएं हैं , और मैं एक वर्ग com.mycompany लोड करने का प्रयास करता हूं। तो , यह com नामक एक निर्देशिका के लिए वर्ग निर्देशिका के तहत दिखेगा , फिर उसके नीचे एक निर्देशिका जिसे mycompany कहा जाता है , और अंत में यह Foo.class नामक फाइल की तलाश करेगा उस निर्देशिका में ।

दूसरे उदाहरण में, जार फ़ाइलों के लिए, यह उस वर्ग के लिए जार फ़ाइल खोजेगा। एक जार फ़ाइल वास्तव में ऊपर की तरह निर्देशिकाओं का सिर्फ एक ज़िपित संग्रह है। यदि आप एक जार फ़ाइल खोलते हैं, तो आपको ऊपर दिए गए पैटर्न के बाद निर्देशिकाओं और वर्ग फ़ाइलों का एक गुच्छा मिलेगा।

इसलिए JVM वर्ग की परिभाषा को खोजने के लिए शुरू से अंत तक एक वर्गपथ का पता लगाता है जब वह वर्ग परिभाषा को लोड करने का प्रयास करता है। उदाहरण के लिए, क्लासपाथ में:

सी: / MyProject / वर्गों; सी: /myproject/lib/stuff.jar; सी: /myproject/lib/otherstuff.jar

JVM निर्देशिका में देखने के लिए प्रयास करेंगे कक्षाएं पहले, बाद में stuff.jar और अंत में otherstuff.jar

जब आपको एक ClassNotFoundException मिलती है, तो इसका मतलब है कि JVM ने पूरे classpath को ट्रेस किया है और आपको जिस क्लास को रेफर करने का प्रयास किया गया है वह नहीं मिला। समाधान, जैसा कि अक्सर जावा दुनिया में होता है, आपके क्लासपाथ की जांच करना है।

आप कमांड लाइन पर एक java -cp और फिर अपना classpath कहकर एक classpath को परिभाषित करते हैं। ग्रहण जैसे आईडीई में, आपके पास अपने वर्गपथ को निर्दिष्ट करने के लिए एक मेनू विकल्प होगा।


13

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

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

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

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

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

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

नोट: आपको उपरोक्त javaकमांड को क्रियान्वित करना होगा चाहे आपका वर्तमान स्थान कोई भी हो। लेकिन यह ऐसा नहीं है javac। संकलन के लिए आप सीधे उस निर्देशिका में भी जा सकते हैं, जहाँ आपकी .javaफाइलें हैं और सीधे निष्पादित होती हैं javac ClassName.java


6

अगर आपको क्लास का रास्ता पता है या जार युक्त क्लास है तो इसे चलाते समय अपने क्लासपाथ में जोड़ें। आप यहाँ वर्णित के रूप में classpath का उपयोग कर सकते हैं:

विंडोज पर

java -classpath .;yourjar.jar YourMainClass

UNIX / Linux पर

java -classpath .:yourjar.jar YourMainClass

4

यदि आप मावेन का उपयोग करते हैं, तो इन्हें आज़माएं। मैं अपनी परियोजना के लिए मावेन का उपयोग करता हूं और जब मैं करता हूं mvn clean installऔर एक कार्यक्रम चलाने की कोशिश करता हूं तो यह अपवाद फेंकता है। इसलिए, मैं इस परियोजना को साफ करता हूं और इसे फिर से चलाता हूं और यह मेरे लिए काम करता है।

मैं ग्रहण आईडीई का उपयोग करता हूं।

जूनिट टेस्ट चलाते समय क्लास नॉट एक्सेप्शन के लिए, mvn clean testएक बार चलाने की कोशिश करें । यह सभी परीक्षण कक्षाओं को संकलित करेगा।


"मावन क्लीन टेस्ट" चलाने पर आप किस निर्देशिका में थे? क्या यह पोम के समान निर्देशिका में है?
TacoB0t

1
हाँ। इसे उस निर्देशिका से रैन करें जहाँ pom फ़ाइल मौजूद है।
अरुण

3

कमांड लाइन के माध्यम से अपने वर्गपथ में एक वर्ग का स्थान जोड़ने के लिए बस इसे चलाते समय -cpया -classpathकक्षा का स्थान जोड़ें । अर्थात

java -cp "c:/location/of/file" YourProgram

या यदि आप एक आईडीई चला रहे हैं जैसे कि आप ग्रहण कर सकते हैं तो आप राइट क्लिक कर सकते project -> build path -> configure build path हैं और बाहरी जेएआर को अपनी कक्षा में जोड़ सकते हैं, फिर उसे ठीक करना चाहिए।


3

उपयोग ';' विभाजक के रूप में। यदि आपके पर्यावरण चर सही तरीके से सेट हैं, तो आपको अपनी सेटिंग्स देखनी चाहिए। यदि आपका PATH और CLASSPATH सही है, तो विंडोज़ को उन कमांड को पहचानना चाहिए। जावा स्थापित करते समय आपको अपने कंप्यूटर को पुनरारंभ करने की आवश्यकता नहीं है।


5
यह विंडोज़ (सेमीकॉलन) पर है, यूनिक्स / लाइनक्स पर यह है: ':' (कोलन)
जोबलेड

3

CLASSPATH में jar फ़ाइल का पूरा पथ जोड़ें । लिनक्स उपयोग में export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH":। अन्य तरीके से काम किया (CLASSPATH को संपादित किए बिना) वर्तमान परियोजना फ़ोल्डर में जार खोल रहा था।

मेरे लिए तरीके काम नहीं करते:

1) -cpजार फ़ाइल के पूर्ण पथ के साथ विकल्प का उपयोग करना ।

2) -cpवर्तमान फ़ोल्डर में स्थित होने पर केवल जार के नाम का उपयोग करना

3) जार को वर्तमान प्रोजेक्ट फ़ोल्डर में कॉपी करना

4) जार जार के मानक स्थान पर जार कॉपी करना (/ usr / शेयर / जावा)

यह समाधान वर्ग com.mysql.jdbc.Driver के लिए mysql-कनेक्टर-ja.5.5 में बताया गया है। * - जार, OpenJDK संस्करण 1.7 के साथ लिनक्स पर काम कर रहा है।


केवल जार को
अनज़िप करने से

2

ऊपर जाएं और यदि एक है, तो आयात स्टेटमेंट को हटा दें और कक्षा को फिर से आयात करें। लेकिन अगर यह मामला साफ नहीं है तो निर्माण करें। क्या आप नेटबीन या ग्रहण का उपयोग कर रहे हैं?


2

मैं इसमें भी भाग गया और अन्य सभी समाधानों की कोशिश की। मेरे HTML फ़ोल्डर में .class फ़ाइल नहीं थी, मेरे पास केवल .java फ़ाइल थी। एक बार जब मैंने .class फ़ाइल जोड़ी तो प्रोग्राम ने ठीक काम किया।


2
  1. यह तब हो सकता है जब आपका क्लासपैथ सही नहीं है

  2. आइए हम एक ही प्रोजेक्टनेम के तहत एक क्रमबद्ध श्रेणी और वांछनीय श्रेणी प्रस्तुत करते हैं। आप क्रमबद्ध श्रेणी चलाते हैं, विशिष्ट फ़ोल्डर में एक सीरियल बनाने योग्य वस्तु बनाते हैं। अब आपको वांछित डेटा की आवश्यकता है। इस बीच, यदि आप प्रोजेक्ट का नाम बदलते हैं तो यह काम नहीं करेगा। आपको पहले श्रेणीबद्ध श्रेणी को चलाना होगा और फिर फ़ाइल को डिस्क्राइब करना होगा।


2

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


2

मैंने अभी किया

1.Invalidate कैश और पुनरारंभ करें

2. मेरी परियोजना का पुनर्निर्माण किया जिसने समस्या को हल किया


1

मैं Processकक्षा का उपयोग करके C # कोड से .jar चलाने की कोशिश कर रहा था । Java कोड ग्रहण से सफलतापूर्वक चला गया, लेकिन यह C # विज़ुअल स्टूडियो से नहीं है और यहां तक ​​कि जार फ़ाइल पर सीधे क्लिक करने पर भी यह हमेशा ClassNotFoundException:अपवाद के रूप में बंद हो जाता है। मेरे लिए समाधान, JAR प्रोग्राम को "JAR फ़ाइल" के बजाय "Runnable JAR फ़ाइल" के रूप में निर्यात किया गया था। आशा है कि यह किसी की मदद कर सकता है।


1

यह जावा अपडेट के बाद विंडोज पर हो सकता है जहां जावा एसडीके का पुराना संस्करण गायब है और एक नया मौजूद है। अगर आपका आईडीई स्थापित जावा एसडीके संस्करण (IntelliJ: CTRL + SHIFT + ALT + S) का उपयोग कर रहा है, तो मैं जांच करूंगा


1

यदि आपने एकाधिक (तृतीय-पक्ष) ** लाइब्रेरीज़ जोड़े हैं और ** एप्लिकेशन क्लास बढ़ाता है

तब हो सकता है।

उसके लिए, आपको multiDexEnabled trueअपनी विस्तारित Applicationकक्षा को सेट और प्रतिस्थापित करना होगा MultiDexApplication

इसे हल किया जाएगा।


1

बेसिक जेनेरिक प्रश्न - सबसे सरल जेनेरिक उत्तर;)

जानकारी को देखते हुए मैं यह धारणा बनाऊंगा कि आप कुछ सरल पाठ संपादक और कुछ कमांड शेल का उपयोग करके "हैलो वर्ल्ड" जैसे सरल कंसोल ऐप को कोडिंग, निर्माण / संकलित करने और चलाने के लिए एक मूल दृष्टिकोण की कोशिश कर रहे होंगे।

यह त्रुटि घटते परिदृश्य में होती है:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

दूसरे शब्दों में, उपयोग करें:

..\SomePath>java HelloWorld

PS फ़ाइल एक्सटेंशन को जोड़ना .class वही गलती उत्पन्न करता है। ऑपरेटिंग सिस्टम के एन्वायरमेंट वेरिएबल्स PATH में जावा (JDK / JRE) बिन फ़ोल्डर होना भी सुनिश्चित करें। (इस पर अन्य विवरणों के लिए लुकअप) पीपीएस क्या मैं अपनी धारणा / एस में सही था?


1

यदि आप मावेन का उपयोग करते हैं, तो जांच लें कि आपके पास यह प्लगइन है pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

यह आपकी निर्भरता (अपवाद का कारण) को आपके जार में डाल देगा।

FYI करें : इसमें अंतिम जार में शामिल सभी निर्भरताएं शामिल होंगी


@ अक्रिट जोड़ा गया।
टेककुज

0

मेरे मामले में कक्षा को अपवाद के रूप में नहीं पाया गया वर्ग में ssl प्रमाणपत्र से संबंधित गुण हैं। ग्रहण को बंद करें और "प्रशासक के रूप में चलाएँ" के साथ खोलें, फिर समस्या हल हो गई। चूंकि ग्रहण से संबंधित अनुमति जारी है, इसलिए यह इस तरह के अपवाद को फेंक देगा।


-7

कोशिश कोड में सभी कोड रखो फिर एक पकड़ने ब्लॉक में अपवाद को पकड़ने

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
यह अपवाद को हल नहीं करता है। यह अपवाद को छुपाता है। इसके अलावा, "e1.getmessage ()" a) getMessage () और b) का गलत कैपिटलाइज़ेशन नहीं है क्योंकि यह एक संदेश के साथ एक स्ट्रिंग लौटाता है और आप इसे प्रिंट नहीं कर रहे हैं या इसे लॉग या कुछ भी नहीं कर रहे हैं!
IBBoard
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.