"मुख्य वर्ग को ढूंढ या लोड नहीं कर सका" क्या मतलब है?


1370

एक सामान्य समस्या जो नए जावा डेवलपर्स अनुभव करते हैं कि उनके प्रोग्राम त्रुटि संदेश के साथ चलने में विफल रहते हैं: Could not find or load main class ...

इसका क्या मतलब है, यह क्या कारण है, और आपको इसे कैसे ठीक करना चाहिए?


37
कृपया ध्यान दें कि यह एक "स्व-उत्तर" प्रश्न है, जिसका उद्देश्य नए जावा उपयोगकर्ताओं के लिए एक सामान्य संदर्भ प्रश्नोत्तर है। मुझे एक मौजूदा क्यू एंड ए नहीं मिला जो इसे पर्याप्त रूप से कवर करता है (आईएमओ)।
स्टीफन C

जवाबों:


1228

java <class-name>आदेश वाक्य रचना

सबसे पहले, आपको java(या javaw) कमांड का उपयोग करके प्रोग्राम लॉन्च करने के सही तरीके को समझने की आवश्यकता है ।

सामान्य वाक्यविन्यास 1 यह है:

    java [ <options> ] <class-name> [<arg> ...]

जहां <option>एक कमांड लाइन विकल्प है ("-" वर्ण के साथ शुरू होता है), <class-name>एक पूरी तरह से योग्य जावा क्लास नाम है, और <arg>एक मनमाना कमांड लाइन तर्क है जो आपके एप्लिकेशन को पास हो जाता है।


1 - कुछ अन्य वाक्यविन्यास हैं जो इस उत्तर के अंत में वर्णित हैं।

वर्ग के लिए पूरी तरह से योग्य नाम (FQN) पारंपरिक रूप से लिखा गया है जैसा कि आप जावा स्रोत कोड में होगा; जैसे

    packagename.packagename2.packagename3.ClassName

हालाँकि javaकमांड के कुछ संस्करण आपको अवधियों के बजाय स्लैश का उपयोग करने की अनुमति देते हैं; जैसे

    packagename/packagename2/packagename3/ClassName

जो (भ्रामक रूप से) फ़ाइल पथनाम की तरह दिखता है, लेकिन एक नहीं है। ध्यान दें कि शब्द पूरी तरह से योग्य नाम मानक जावा शब्दावली है ... ऐसा कुछ नहीं है जिसे मैंने सिर्फ आपको भ्रमित करने के लिए बनाया है :-)

यहाँ एक उदाहरण है कि javaकमांड को कैसा दिखना चाहिए:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

ऊपर javaकमांड निम्नलिखित को करने का कारण बनने जा रहा है :

  1. com.acme.example.ListUsersकक्षा के संकलित संस्करण की खोज करें ।
  2. कक्षा को लोड करें।
  3. जांचें कि कक्षा में हस्ताक्षर , रिटर्न प्रकार और संशोधक द्वारा दी गई mainविधि है । (ध्यान दें, विधि तर्क का नाम हस्ताक्षर का हिस्सा नहीं है ।)public static void main(String[])
  4. उस विधि को कमांड लाइन तर्क ("फ़्रेड", "जो", "बर्ट") के रूप में कॉल करें String[]

क्यों जावा वर्ग नहीं ढूँढ सकता है

जब आपको संदेश मिलता है "मुख्य वर्ग को ढूंढ या लोड नहीं कर सका ...", इसका मतलब है कि पहला चरण विफल हो गया है। javaआदेश वर्ग को खोजने के लिए सक्षम नहीं था। और वास्तव में, संदेश में "..." पूरी तरह से योग्य वर्ग नाम होगा जो javaखोज रहा है।

तो यह वर्ग खोजने में असमर्थ क्यों हो सकता है?

कारण # 1 - आपने क्लासनाम तर्क के साथ गलती की

पहला संभावित कारण यह है कि आपने गलत श्रेणी का नाम प्रदान किया होगा। (या सही वर्ग का नाम, लेकिन गलत रूप में।) ऊपर दिए गए उदाहरण को ध्यान में रखते हुए, वर्ग नाम निर्दिष्ट करने के लिए कई तरह के गलत तरीके हैं:

  • उदाहरण # 1 - एक साधारण वर्ग का नाम:

    java ListUser

    जब क्लास को पैकेज के रूप में घोषित किया जाता है com.acme.example, तो आपको कमांड में पैकेज नाम सहित पूर्ण क्लासनाम का उपयोग करना होगा java; जैसे

    java com.acme.example.ListUser
  • उदाहरण # 2 - एक वर्ग नाम के बजाय एक फ़ाइल नाम या पथनाम:

    java ListUser.class
    java com/acme/example/ListUser.class
  • उदाहरण # 3 - आवरण गलत के साथ एक वर्ग का नाम:

    java com.acme.example.listuser
  • उदाहरण # 4 - एक टाइपो

    java com.acme.example.mistuser
  • उदाहरण # 5 - एक स्रोत फ़ाइल नाम (जावा 11 को छोड़कर या बाद में; नीचे देखें)

    java ListUser.java
  • उदाहरण # 6 - आप पूरी तरह से वर्ग का नाम भूल गए

    java lots of arguments

कारण # 2 - आवेदन का वर्गपथ गलत तरीके से निर्दिष्ट है

दूसरा संभावित कारण यह है कि वर्ग का नाम सही है, लेकिन यह कि javaकमांड वर्ग को नहीं ढूंढ सकता है। इसे समझने के लिए, आपको "क्लासपाथ" की अवधारणा को समझने की आवश्यकता है। यह ओरेकल प्रलेखन द्वारा अच्छी तरह से समझाया गया है:

इसलिए ... यदि आपने कक्षा का नाम सही ढंग से निर्दिष्ट किया है, तो जांच करने के लिए अगली बात यह है कि आपने कक्षापथ को सही ढंग से निर्दिष्ट किया है:

  1. ऊपर दिए गए तीन दस्तावेजों को पढ़ें। (हां ... उन्हें पढ़ें! यह महत्वपूर्ण है कि एक जावा प्रोग्रामर कम से कम मूल बातें समझता है कि जावा क्लासपथ तंत्र कैसे काम करता है।)
  2. कमांड लाइन और / या CLASSPATH पर्यावरण चर को देखें जो प्रभाव में है जब आप चलाते हैं java कमांड । जाँचें कि निर्देशिका नाम और JAR फ़ाइल नाम सही हैं।
  3. यदि क्लासपाथ में रिश्तेदार पथनाम हैं , तो जांच लें कि वे सही ढंग से हल करते हैं ... वर्तमान निर्देशिका से जब आप चलते हैंjava कमांड ।
  4. जांचें कि कक्षा (त्रुटि संदेश में उल्लिखित) प्रभावी वर्गपथ पर स्थित हो सकती है ।
  5. ध्यान दें कि क्लासपैथ सिंटैक्स विंडोज बनाम लिनक्स और मैक ओएस के लिए अलग है । (क्लासपैथ विभाजक ;विंडोज पर है और: पर और अन्य पर है। यदि आप अपने प्लेटफ़ॉर्म के लिए गलत विभाजक का उपयोग करते हैं, तो आपको एक स्पष्ट त्रुटि संदेश नहीं मिलेगा। इसके बजाय, आपको उस पथ पर कोई न कोई फ़ाइल या निर्देशिका मिल जाएगी जिसे चुपचाप अनदेखा कर दिया जाएगा। ।)

कारण # 2a - गलत निर्देशिका क्लासपैथ पर है

जब आप क्लासपाथ पर एक निर्देशिका डालते हैं, तो यह विशेष रूप से योग्य नाम स्थान की जड़ से मेल खाती है। कक्षाएं रूट के नीचे निर्देशिका संरचना में स्थित होती हैं, पूरी तरह से योग्य नाम को एक मार्गनाम से मैप करके । उदाहरण के लिए, यदि "/ usr / स्थानीय / acme / कक्षाएं" वर्ग पथ पर है, तो जब JVM नामक एक वर्ग की तलाश करता है com.acme.example.Foon, तो वह इस पथनाम के साथ ".class" फ़ाइल की तलाश करेगा:

  /usr/local/acme/classes/com/acme/example/Foon.class

अगर आपने क्लासपैथ पर "/ usr / स्थानीय / acme / classes / com / acme / उदाहरण" रखा था, तो JVM क्लास को खोजने में सक्षम नहीं होगा।

कारण # 2b - उपनिर्देशिका पथ FQN से मेल नहीं खाता है

यदि आपकी कक्षाएं FQN है com.acme.example.Foon, तो JVM "कॉम / acme / उदाहरण" निर्देशिका में "Foon.class" देखने जा रहा है:

  • यदि आपकी निर्देशिका संरचना उपरोक्त पैटर्न के अनुसार पैकेज के नामकरण से मेल नहीं खाती है, तो JVM आपकी कक्षा को नहीं खोजेगा।

  • यदि आप इसे स्थानांतरित करके एक वर्ग का नाम बदलने का प्रयास करते हैं, तो यह भी विफल हो जाएगा ... लेकिन अपवाद स्टैकट्रेस अलग होगा। यह इस तरह से कुछ कहने के लिए उत्तरदायी है:

    Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)

    क्योंकि क्लास फ़ाइल में FQN मैच नहीं करता है जो क्लास लोडर को खोजने की उम्मीद कर रहा है।

एक ठोस उदाहरण देने के लिए, यह मानते हुए कि:

  • आप com.acme.example.Foonक्लास चलाना चाहते हैं ,
  • पूर्ण फ़ाइल पथ है /usr/local/acme/classes/com/acme/example/Foon.class,
  • आपकी वर्तमान कार्यशील निर्देशिका है /usr/local/acme/classes/com/acme/example/,

फिर:

# wrong, FQN is needed
java Foon

# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

टिप्पणियाँ:

  • -classpathविकल्प के लिए छोटा किया जा सकता -cpसबसे जावा विज्ञप्ति में। संबंधित मैनुअल प्रविष्टियों की जाँच करें java, javacऔर इसी तरह।
  • क्लासपाथों में निरपेक्ष और सापेक्ष रास्तों के बीच चयन करते समय ध्यान से सोचें। याद रखें कि यदि वर्तमान निर्देशिका में परिवर्तन होता है तो एक रिश्तेदार मार्गनाम "टूट" सकता है।

कारण # 2 सी - क्लासपाथ से निर्भरताएं गायब हैं

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

(नोट: JLS और JVM विनिर्देश JVM के लिए वर्गों को "आलसी" लोड करने के लिए कुछ गुंजाइश की अनुमति देते हैं, और यह तब प्रभावित हो सकता है जब एक क्लास लोडर अपवाद को फेंक दिया जाता है।)

कारण # 3 - वर्ग गलत पैकेज में घोषित किया गया है

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

अभी भी समस्या नहीं मिल सकती है?

जांच करने के लिए बहुत सी चीजें हैं, और कुछ को याद करना आसान है। कमांड लाइन के -Xdiagविकल्प को जोड़ने का प्रयास करें java(बाद में पहली चीज के रूप में java)। यह क्लास लोडिंग के बारे में विभिन्न चीजों का उत्पादन करेगा, और यह आपको सुराग दे सकता है कि वास्तविक समस्या क्या है।

इसके अलावा, वेबसाइटों, दस्तावेज़ों आदि से अदृश्य या गैर-एएससीआईआई पात्रों को कॉपी और पेस्ट करने के कारण होने वाली संभावित समस्याओं पर विचार करें। और "सजातीय" पर विचार करें, क्या दो अक्षर थे या प्रतीक समान दिखते हैं ... लेकिन नहीं हैं।

अंत में, आप जाहिरा तौर पर इस समस्या में भाग सकते हैं यदि आप JAR फ़ाइल से गलत हस्ताक्षर के साथ लॉन्च करने का प्रयास करते हैं (META-INF/*.SF)


के लिए वैकल्पिक वाक्यविन्यास java

का उपयोग करते हुए लॉन्चिंग जावा प्रोग्राम के लिए तीन वैकल्पिक वाक्यविन्यास हैं java command

1) "एक्जीक्यूटेबल" JAR फ़ाइल लॉन्च करने के लिए इस्तेमाल किया गया सिंटैक्स इस प्रकार है:

  java [ <options> ] -jar <jar-file-name> [<arg> ...]

जैसे

  java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

प्रवेश बिंदु वर्ग (यानी com.acme.example.ListUser) और वर्गपथ का नाम जार फ़ाइल के मैनिफेस्ट में निर्दिष्ट किया गया है।

2) एक मॉड्यूल (जावा 9 और बाद के) से एक एप्लिकेशन को लॉन्च करने के लिए सिंटैक्स निम्नानुसार है:

  java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]

एंट्रीपॉइंट क्लास का नाम या तो <module>स्वयं द्वारा परिभाषित किया गया है, या वैकल्पिक द्वारा दिया गया है <mainclass>

3) जावा 11 के बाद, आप एक एकल स्रोत कोड फ़ाइल को संकलित और चला सकते हैं और इसे निम्नलिखित सिंटैक्स के साथ चला सकते हैं:

  java [ <options> ] <sourcefile> [<arg> ...]

जहां (आमतौर पर) प्रत्यय "। जावा" के साथ एक फ़ाइल है।

अधिक विवरण के लिए, कृपया javaजावा रिलीज़ के लिए कमांड के आधिकारिक दस्तावेज देखें, जो आप उपयोग कर रहे हैं।


IDEs

एक सामान्य जावा आईडीई में स्वयं या बच्चे के जेवीएम में आईडीई जेवीएम में जावा अनुप्रयोगों को चलाने के लिए समर्थन है। ये हैं आम तौर पर , इस विशेष अपवाद से प्रतिरक्षा क्योंकि आईडीई का अपना तंत्र का उपयोग करता है, क्रम classpath का निर्माण मुख्य वर्ग की पहचान करने और बनाने के लिए javaकमांड लाइन।

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

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

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


अन्य संदर्भ


43
मुझे यह समस्या तब हुई जब मैं तीसरी पार्टी लाइब्रेरी के साथ क्लास चलाने की कोशिश कर रहा था। मैं इस तरह जावा अनुरोध किया गया: java -cp ../third-party-library.jar com.my.package.MyClass; यह काम नहीं करता है, इसके बजाय यह आवश्यक है कि स्थानीय फ़ोल्डर को वर्ग पथ के साथ जोड़ा जाए ( :इस तरह अलग किया गया है : java -cp ../third-party-library.jar:. com.my.package.MyClassफिर, यह काम करना चाहिए
lanoxx

22
जावा प्रोग्रामिंग के वर्षों के बाद भी मैं इस पृष्ठ पर समाप्त होने में कामयाब रहा। मेरे लिए मुद्दा यह था कि क्लासपैथ सिंटैक्स ओएस पर निर्भर है । मैं विंडोज़ पर प्रोग्रामिंग के लिए नया हूँ और मुझे कोई पता नहीं था।
कीसर

5
अतिरिक्त नोट्स, बिंदु 2 मुझे बचाओ! यह देखकर दुख javaहोता है कि यह नहीं कहता कि यह एक आयातित वर्ग नहीं है, लेकिन इसके बजाय मुख्य वर्ग जिसे आप चलाने की कोशिश कर रहे हैं। यह भ्रामक है, हालांकि मुझे यकीन है कि इसके लिए एक कारण है। मेरे पास ऐसा मामला javaथा जहाँ मुझे पता था कि मेरी कक्षा कहाँ है, हालाँकि यह आयातित कक्षाओं में से एक को नहीं खोज सका। ऐसा कहने के बजाय, इसने मेरी मुख्य कक्षा नहीं ढूंढने के बारे में शिकायत की। सच में, annoing।
MSX

मुझे ग्रहण में यह समस्या दो बार हुई थी। पहली बार मुख्य () का हस्ताक्षर गलत था। दूसरी बार जब मैंने एक .jar का नाम बदला है, और भले ही मैंने नए को बिल्ड पथ में जोड़ा है, लेकिन ग्रहण को पुराना नहीं मिला, इसलिए इस त्रुटि के साथ प्रोजेक्ट संकलित नहीं हुआ। मुझे प्रोजेक्ट> गुण> जावा बिल्ड पथ> लाइब्रेरी से .jar फ़ाइल को हटाना पड़ा।
ग्रेग

मैंने इसका तीसरी बार सामना किया है। मैंने प्रोग्राम को विंडोज 10 बैच फ़ाइल से चलाया है, और .jar नाम को एक चर में रखा है (जिसे "-cp% rarname%; lib *" कहा जाता है)। मैंने गलती से जारनाम के अंत में एक अतिरिक्त स्थान डाल दिया है, और यह त्रुटि का कारण बना। हैट ट्रिक :)
ग्रेगेट

239

यदि आपके स्रोत कोड का नाम HelloWorld.java है, तो आपका संकलित कोड होगा HelloWorld.class

यदि आप इसका उपयोग करके कॉल करते हैं, तो आपको वह त्रुटि मिलेगी:

java HelloWorld.class

इसके बजाय, इसका उपयोग करें:

java HelloWorld

3
समस्या यह है कि यह समाधान केवल JAR फ़ाइल निर्भरता वाले डिफ़ॉल्ट पैकेज में घोषित जावा कक्षाओं के लिए काम करता है। (और फिर भी, सभी समय का नहीं।) अधिकांश जावा प्रोग्राम इतने सरल नहीं हैं।
स्टीफन सी।

1
स्टीफन ने कहा, यह केवल "डिफ़ॉल्ट पैकेज" के साथ काम करता है - जिसका अर्थ है कि फ़ाइल के शीर्ष पर कोई पैकेज घोषणा नहीं है । कुछ कोड के एक त्वरित परीक्षण के लिए, मैं था: javac TestCode.javaद्वारा पीछा कियाjava TestCode
किसी ने कहीं न कहीं

इसने मेरे लिए काम नहीं किया। यह अभी भी कहता है, "मुख्य वर्ग HelloWorld को ढूंढ या लोड नहीं कर सका"
जिम

java -jar HelloWorld.jar भी एक विकल्प है
BMaximus

12
मुझे करने की आवश्यकता थीjava -classpath . HelloWorld
क्रिस प्रिंस

136

यदि आपकी कक्षाएं संकुल में हैं, तो आपको cdअपनी परियोजना की मूल निर्देशिका में जाना होगा और वर्ग के पूर्ण रूप से योग्य नाम (packageName.MainClassName) का उपयोग करके चलाना होगा।

उदाहरण:

मेरी कक्षाएं यहाँ हैं:

D:\project\com\cse\

मेरे मुख्य वर्ग का पूरी तरह से योग्य नाम है:

com.cse.Main

इसलिए मैं cdरूट प्रोजेक्ट निर्देशिका पर वापस आता हूं :

D:\project

फिर javaआदेश जारी करें :

java com.cse.Main

यह उत्तर नौसिखिया जावा प्रोग्रामर को एक सामान्य गलती के कारण हताशा से बचाने के लिए है, मैं आपको जावा क्लासपथ के बारे में अधिक गहराई से ज्ञान के लिए स्वीकृत उत्तर पढ़ने की सलाह देता हूं।


2
यह उत्तर संपूर्ण मान्यताओं का भार बनाता है। और इसे प्राप्त करने के अन्य तरीके हैं। उपरोक्त सलाह का आँख बंद करके इस्तेमाल करने के बजाय, मैं सुझाव दूंगा कि लोग मेरे उत्तर में लिंक को पढ़ने के लिए समय निकालें, जो यह बताता है कि जावा सहपाठी कैसे काम करता है। UNDERSTAND के लिए बेहतर है कि आप क्या कर रहे हैं ...
स्टीफन C

2
यह उत्तर सटीक अनुमान लगाता है कि मुझे ज़रूरत थी :) मैं .class फ़ाइल की निर्देशिका में स्थित था और java.exe काम नहीं कर रहा था। एक बार जब मैंने ऊपर cd-ed किया और कमांड लाइन में शामिल पैकेज नाम के साथ भाग गया, तो यह काम किया।
निक कॉन्सटेंटाइन

61

यदि आप मुख्य वर्ग और मुख्य विधि को परिभाषित करते हैंpackage , तो आपको इसे श्रेणी के पूर्ण नाम ( packageName.MainClassName) का उपयोग करके, श्रेणीबद्ध निर्देशिका पर चलाना चाहिए ।

मान लें कि कोई स्रोत कोड फ़ाइल है (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

इस कोड को चलाने के लिए, आपको Main.Classनिर्देशिका जैसे पैकेज में जगह चाहिए ./com/test/Main.Java। और रूट डायरेक्टरी उपयोग में java com.test.Main


1
मेरे उत्तर के "अतिरिक्त नोट्स # 1" देखें। इस समस्या के बेहतर स्पष्टीकरण के लिए।
स्टीफन सी

14
@StephenC हां, आपका उत्तर अधिक पूर्ण है (और निश्चित रूप से, +1), लेकिन इस विशेष उत्तर में "पैकेज" शब्द था, जिसने मुझे वह खोजने की अनुमति दी, जिसकी मुझे तीव्र आवश्यकता थी। और इसने काम किया। तो +1 रजवी। स्टीफन, आपके पास सरल पैकेज उदाहरण का अभाव है जिसकी मुझे जरूरत थी क्योंकि मैं जावा में नया हूं।
19

5
यह वास्तव में मेरी समस्या थी। मैं जावा डॉक्टर के टन के माध्यम से जा रहा हूँ और इस ठोस उदाहरण है कि मैं क्या जरूरत है
जॉन

1
हां, ठोस उदाहरण अच्छा है, यह पूरी तरह से काम करता है। मुझे यकीन है कि मुख्य उत्तर बहुत गहन है, लेकिन जंगल के लिए पेड़ को देखना मुश्किल था। एक अच्छा @ रज़ावी
पिक्सेल

1
मुझे स्वीकार किए जाने के बजाय यह छोटा और उपयोगी उत्तर पसंद है!
स्पारा

46

जब समान कोड एक पीसी पर काम करता है, लेकिन यह दूसरे में त्रुटि दिखाता है, जो सबसे अच्छा समाधान मैंने कभी पाया है वह निम्नलिखित की तरह संकलित कर रहा है:

javac HelloWorld.java
java -cp . HelloWorld

2
यह एक अच्छी सिफारिश नहीं है। आप CLASSPATH वातावरण चर पर आधारित नहीं हैं, या ""। हां, यह कई मामलों में काम करता है, लेकिन यह दूसरों में नहीं होगा।
स्टीफन सी

खैर निश्चित रूप javac -classpath . HelloWorld.javaसे काम किया होगा! और यह आपके मामले में बेहतर समाधान है।
स्टीफन सी

2
यदि आपके पास पहली पंक्ति के रूप में 'पैकेज com.some.address' है - तो यह काम नहीं करेगा। आपको 'पैकेज पता' पर टिप्पणी करने की आवश्यकता होगी ..
जो 20

1
@ जो - यह हैक (पैकेज पर टिप्पणी करना) काम करेगा (कुछ मामलों में) लेकिन यह एक बुरा विचार है। एक बेहतर विचार यह जानना / समझना है कि समस्या का कारण क्या है और सही समाधान को लागू करना है।
स्टीफन C

36

उदाहरण के लिए, कमांड लाइन पर क्लासपाथ को निर्दिष्ट करने में मुझे क्या मदद मिली:

  1. एक नया फ़ोल्डर बनाएं, C:\temp

  2. C:\tempइसमें निम्न वर्ग के साथ, फ़ाइल Temp.java बनाएँ :

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
  3. फ़ोल्डर में एक कमांड लाइन खोलें C:\temp, और टेंप क्लास को संकलित करने के लिए निम्न कमांड लिखें:

    javac Temp.java
  4. संकलित जावा क्लास को चलाएं, -classpathJRE को यह बताने के लिए विकल्प जोड़ें कि कक्षा को कहाँ खोजें:

    java -classpath C:\temp Temp Hello!

3
उबंटू में, मुझे भी पथ निर्दिष्ट करना पड़ा। समझ में नहीं आता कि यह डिफ़ॉल्ट रूप से वर्तमान कार्य निर्देशिका का उपयोग क्यों नहीं कर सकता है। मुझे विश्वास है कि कीबोर्ड निर्माताओं द्वारा जावा प्रायोजित है !!
चला गया

1
@ गॉन - कारण है कि "।" डिफ़ॉल्ट रूप से $ PATH में नहीं है कि यह एक सुरक्षा जाल है। सीप.सुपे.येडू
स्टीफन सी।

इसके लिए बहुत बहुत धन्यवाद ...... भले ही यह न पता हो कि पर्यावरण चर में स्थापित करने के बाद भी जावा को क्लासपाथ का पता क्यों नहीं चल पा रहा था।
अकाश a

@ akash89 - सबसे संभावित कारण थे: 1) java$ CLASSPATH को नहीं देख रहा था (क्योंकि आपने -क्लासपैथ या -जर का इस्तेमाल किया था) या 2) क्लासपैथ सेटिंग उस वातावरण में सेट नहीं की गई थी जो उस संदर्भ में प्रभावी नहीं javaथा Daud; उदाहरण के लिए, क्योंकि आपने उस फ़ाइल को "स्रोत" नहीं किया है, जहां सेटनव कमांड को सही शेल में जोड़ा गया है।
स्टीफन सी

मुझे अभी भी त्रुटि मिली: मुख्य वर्ग को ढूंढने या लोड करने में सक्षम नहीं हो सका, कोई भी मदद कर सकता है!
स्टार

27

त्रुटि संदेश के अनुसार ("मुख्य वर्ग को ढूंढ या लोड नहीं कर सका"), समस्याओं की दो श्रेणियां हैं:

  1. मुख्य वर्ग नहीं मिला
  2. मुख्य वर्ग लोड नहीं किया जा सका (यह मामला स्वीकृत उत्तर में पूरी तरह से चर्चा में नहीं है)

मुख्य वर्ग तब नहीं पाया जा सकता है जब पूरी तरह से योग्य वर्ग के नाम में टाइपो या गलत सिंटैक्स हो या प्रदान की गई क्लासपाथ में यह मौजूद नहीं है

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

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

public class YourMain extends org.apache.camel.spring.Main

यदि ऊंट-वसंत शामिल नहीं है, तो यह त्रुटि रिपोर्ट की जाएगी।


"मूल रूप से" बहुत सारी अन्य श्रेणियां भी हैं। और लापता सुपरक्लास समस्या एक बहुत ही असामान्य सबकेस है। (इतना असामान्य कि मैंने इसे कभी नहीं देखा ... इस साइट पर पूछे गए सवालों में।)
स्टीफन सी।

दो कारण हैं क्योंकि त्रुटि कहती है "मुख्य वर्ग को खोज या लोड नहीं कर सकता"। यदि अन्य श्रेणियां हैं, तो कृपया मुझे सलाह दें। मैंने इसे देखा है, इसलिए बस इसे यहां साझा करना चाहता हूं शायद किसी और को इसकी आवश्यकता होगी।
जिओ पेंग - ZenUML.com

1
मैंने इसे कुछ इस तरह से संशोधित किया होगा "आपको उन सभी वर्गों को शामिल करने की आवश्यकता है जो इस गंभीर त्रुटि से बचने के लिए मुख्य वर्ग को आरंभ करने के लिए आवश्यक है"। मैं आपको समझाने की कोशिश नहीं कर रहा हूं। यह सिर्फ एक तरीका है जिसे मैं देखना चाहूंगा। मैंने यहाँ जवाब सिर्फ उन लोगों के लिए छोड़ा है जो इस तरह से चीजों को पढ़ना पसंद करते हैं। चलिए इस चर्चा को आगे नहीं बढ़ाते हैं :) मैंने अपना बयान "स्वीकार किए गए उत्तर में पूरी तरह से चर्चा नहीं किया" और आशा है कि आप बेहतर महसूस करेंगे।
जिओ पेंग - ZenUML.com

5
यह जानकारी महत्वपूर्ण है और एक स्पष्ट उल्लेख के योग्य है (यह एकमात्र उत्तर है जो उल्लेख करता है extends)। मैंने अभी मुश्किल तरीका सीखा है कि जब मुख्य वर्ग लोड करने में विफल रहता है क्योंकि यह एक और विस्तार करता है जो नहीं मिल सकता है , जावा रिपोर्ट नहीं करता है कि कौन सा वास्तविक वर्ग नहीं मिला (विपरीत NoClassDefFoundError)। तो हाँ ऐसा होता है, और यह एक बाल खींचने की स्थिति है जब आपको यह नहीं पता है।
ह्यूजेस एम।

1
इस स्थिति में क्या वास्तव में यह बताने का कोई तरीका है कि कौन सी निर्भरता वर्ग लोड करने में विफल हो रहा है?
कार्लोस ए। इबर्रा

16

इस मामले में मेरी ऐसी त्रुटि थी:

java -cp lib.jar com.mypackage.Main

यह ;विंडोज के लिए और :यूनिक्स के लिए काम करता है :

java -cp lib.jar; com.mypackage.Main

हाँ। यह सबसे अधिक संभावना है क्योंकि आपका MainJAR फ़ाइल में नहीं है। -cp lib.jar;इसका मतलब वही है -cp lib.jar;. जो मौजूदा निर्देशिका क्लासपाथ पर शामिल है।
स्टीफन सी।

अंत में यूनिक्स के लिए मुद्दा तय किया .. धन्यवाद (:) के साथ काम करता है
विक्की

16

कोशिश -Xdiag

स्टीव सी का जवाब संभव मामलों को अच्छी तरह से कवर करता है, लेकिन कभी-कभी यह निर्धारित करने के लिए कि क्या क्लास नहीं पाया जा सकता है या लोड नहीं किया जा सकता है। उपयोग करें java -Xdiag(JDK 7 के बाद से)। यह एक अच्छा स्टैकट्रेस प्रिंट करता है जो संदेश को एक संकेत प्रदान करता हैCould not find or load main class संदेश का अर्थ है।

उदाहरण के लिए, यह आपको मुख्य वर्ग द्वारा उपयोग की जाने वाली अन्य कक्षाओं के लिए इंगित कर सकता है, जिन्हें ढूंढा नहीं जा सकता है और मुख्य वर्ग को लोड करने से रोका जा सकता है।


16

इस कमांड का उपयोग करें:

java -cp . [PACKAGE.]CLASSNAME

उदाहरण: यदि आपका classname Hello.class Hello.java से बनाया गया है, तो नीचे दिए गए कमांड का उपयोग करें:

java -cp . Hello

यदि आपकी फ़ाइल Hello.java पैकेज com.demo के अंदर है, तो नीचे दिए गए कमांड का उपयोग करें

java -cp . com.demo.Hello

JDK 8 के साथ कई बार ऐसा होता है कि क्लास फाइल एक ही फोल्डर में मौजूद होती है, लेकिन javaकमांड को क्लासपैथ की उम्मीद होती है और इसी कारण से हम क्लास -cp .फोल्डर के संदर्भ में वर्तमान फोल्डर को लेने के लिए जोड़ते हैं ।


यह केवल साधारण मामलों में काम करता है। अधिक जटिल मामलों में अधिक जटिल वर्गपथ की आवश्यकता होती है।
स्टीफन सी

और >> वास्तव में << सरल मामलों के लिए, -cp .अनावश्यक है, क्योंकि यदि $CLASSPATHकोई परेशान है, तो .डिफ़ॉल्ट क्लासपैथ है।
स्टीफन C

नहीं स्टीफन, कई बार विंडोज डिफॉल्ट क्लासपाथ में काम नहीं करता है। मैंने इसे तीन अलग-अलग मशीनों पर आज़माया, आप इसे भी आज़मा सकते हैं।
shailU

यह शायद इसलिए है क्योंकि आपने वास्तव में% CLASSPATH% पर्यावरण चर को कहीं पर सेट किया है। यदि आप ऐसा करते हैं, तो आप डिफ़ॉल्ट क्लासपाथ का उपयोग नहीं कर रहे हैं। ( echo %CLASSPATH%आउटपुट क्या है ?) और नहीं, मैं जांच नहीं कर सकता क्योंकि मेरे पास विंडोज पीसी नहीं है।
स्टीफन सी

2
यह मेरे लिए तब काम आया जब मैंने कमांड लाइन से एक साधारण प्रोग्राम चलाने की कोशिश की
SnuKies

15

कभी-कभी समस्या के कारण मुख्य वर्ग से कोई लेना-देना नहीं होता है, और मुझे इसका पता लगाना था। यह एक संदर्भित पुस्तकालय था जिसे मैंने स्थानांतरित किया, और इसने मुझे:

मुख्य वर्ग xxx लिनक्स को ढूंढ या लोड नहीं कर सका

मैंने बस उस संदर्भ को हटा दिया, इसे फिर से जोड़ा, और यह फिर से ठीक काम किया।


1
ऐसा लगता है कि समस्या यह थी कि आपके आईडीई में आपकी परियोजना में टूटे हुए "संदर्भ" के कारण आपके पास एक गलत क्लासपैथ था। मैं उस मामले को कवर करने के लिए अपना जवाब अपडेट करूंगा।
स्टीफन C

@StephenC और EduardoDennis, यह था कि यहां भी एक जार गायब था, उस जार में एक इंटरफ़ेस होता था जो मुख्य वर्ग पर निर्भर करता था। इसलिए, त्रुटि संदेश बहुत व्यापक है। मुझे यह कहना चाहिए कि अगर "फ़ाइल नहीं मिली है तो" नहीं मिल सकती है और "लोड नहीं कर सकती है (निर्भरताएँ) लोड नहीं कर सकती" यदि कोई और चीज़ गायब है लेकिन फ़ाइल ही नहीं है, तो त्रुटि संदेश बहुत व्यापक होने के बावजूद केवल ध्यान केंद्रित करने पर भ्रामक है इसके "भाग" का पता लगाएं :(
कुंभ राशि

@AquariusPower - "अतिरिक्त" अपवाद के लिए "स्टैकट्रेस" के कारण एक अतिरिक्त होना चाहिए था, जिसने कहा कि सीटी क्लास गायब थी। यदि आप जावा डेवलपर्स को सुझाव देना चाहते हैं कि वे एक त्रुटि संदेश बदल दें जो कह रहा है कि 20+ वर्षों से ... मुफ्त में महसूस करें। (मुझे लगता है कि त्रुटि संदेश सही है। समस्या यह थी कि आप >> << गलत क्लॉज पर संकुचित हैं।)
स्टीफन C

@StephenC मेरा क्या मतलब है, उनके पास निश्चित रूप से जानकारी तक पहुंच है यदि मुख्य वर्ग फ़ाइल उपलब्ध है या नहीं, तो क्यों न हमें एक बेहतर त्रुटि संदेश दिखाते हुए कहा जाए कि ऐसी फाइल गायब है। दूसरी ओर, वे यह भी कह सकते हैं कि "फाइल मिल गई थी, लेकिन लोड नहीं की जा सकी" उस बिंदु पर, हम तुरंत आधा दिन शोध और चीजों को समझने के लिए परीक्षण को खोने के बजाय निर्भरता पर ध्यान केंद्रित करेंगे। बस मेरा यही मतलब था :)। वे इसे 20+ वर्षों के लिए सीमित तरीके से कर सकते हैं, लेकिन वे इसे सुधार सकते हैं और हम यहां यह मानने के लिए हैं कि हमारी आलोचना और शिकायतों के कारण होगा! : डी
कुंभ राशि पावर

कृपया समझें कि >> I << का क्या अर्थ है। 3 साल की क्यू एंड ए पर कुछ अस्पष्ट टिप्पणी में इसके बारे में शिकायत करने से कुछ हासिल नहीं होने वाला है। जो लोग आपकी शिकायतों पर कार्रवाई कर सकते हैं वे इसे नोटिस नहीं करेंगे। यदि आप कुछ रचनात्मक करना चाहते हैं, तो एक पैच जमा करें। (मैं आपके अवसरों को दर नहीं करता, लेकिन यदि आप सिर्फ इसके बारे में सोचते हैं तो वे इससे अधिक होंगे।)
स्टीफन C

10

इस उदाहरण में आपके पास:

मुख्य वर्ग ? वर्गपथ को खोज या लोड नहीं कर सका

ऐसा इसलिए है क्योंकि आप "-classpath" का उपयोग कर रहे हैं, लेकिन डैश javaकमांड प्रॉम्प्ट पर उपयोग किए जाने वाले डैश नहीं है । मेरे पास नोटपैड से लेकर सेमी तक कॉपी और पेस्ट करने का यह मुद्दा था ।


2
वाह! यह एक पूरी तरह से विचित्र कारण है! (लेकिन यह आपको एक वास्तविक पाठ संपादक :-) के बजाय नोटपैड का उपयोग करने के लिए सही काम करता है)
स्टीफन सी

10

मुझे एक ही समस्या थी और अंत में मुझे अपनी गलती का पता चला :) मैंने इस कमांड का इस्तेमाल संकलन के लिए किया और यह सही तरीके से काम करती है:

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

लेकिन यह कमांड मेरे लिए काम नहीं करता था (मैं मुख्य वर्ग को ढूंढ या लोड नहीं कर सका, qrcode):

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

अंत में मैंने क्लासपैथ के अंत में ':' वर्ण जोड़ा और समस्या हल हो गई:

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode

7

मेरे मामले में, त्रुटि दिखाई दी क्योंकि मैंने वर्ग नाम के बजाय स्रोत फ़ाइल नाम की आपूर्ति की थी।

हमें दुभाषिया को मुख्य विधि वाले वर्ग नाम की आपूर्ति करने की आवश्यकता है।


हाँ। वर्ग नाम निर्दिष्ट करने के गलत तरीकों के मेरे उदाहरण # 2 देखें !!
स्टीफन C

7

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

मैंने इसे इस तरह संकलित किया है:

javac HelloWorld.java

और मैंने भी उसी विस्तार के साथ चलने की कोशिश की:

java Helloworld.java

जब मैंने हटा दिया .javaऔर जैसे आदेश को फिर से लिखा java HelloWorld, तो कार्यक्रम पूरी तरह से चला। :)


2
ऐसा इसलिए है क्योंकि आप अपने .java के संकलित संस्करण को निष्पादित कर रहे हैं। यह वास्तव में .class फ़ाइल को निष्पादित कर रहा है
जेसन V

रिकॉर्ड के लिए, यह मेरे उत्तर में कारण # 1, उदाहरण # 5 के समान है ...
स्टीफन सी

6

यहां सभी उत्तर विंडोज उपयोगकर्ताओं के लिए निर्देशित हैं जो ऐसा लगता है। मैक के लिए, क्लासपैथ विभाजक है :, नहीं ;। क्लासपाथ को सेट करने में त्रुटि के रूप में उपयोग ;नहीं किया जाता है, तो विंडोज से मैक पर आने पर यह पता लगाना मुश्किल हो सकता है।

यहाँ मैक आदेश इसी है:

java -classpath ".:./lib/*" com.test.MyClass

जहां इस उदाहरण में पैकेज है com.testऔर libक्लासपथ पर एक फ़ोल्डर भी शामिल किया जाना है।


2
लिनक्स पर मैक के रूप में।
2178 में एलेक्स78191

क्यों /*जरूरी है?
2178 में एलेक्स78191

यह एक वाइल्डकार्ड सिंटेक्स है। (यह अनिवार्य नहीं है। यदि आप चाहें तो जार को स्पष्ट रूप से सूचीबद्ध कर सकते हैं।)
स्टीफन सी

6

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

वर्ग फ़ाइल स्थान: C: \ test \ com \ company

फ़ाइल का नाम: Main.class

पूरी तरह से योग्य वर्ग का नाम: com.company.Main

कमांड लाइन कमांड:

java  -classpath "C:\test" com.company.Main

यहाँ ध्यान दें कि वर्ग पथ में \ com \ company शामिल नहीं है


6

मैंने इस समस्या को हल करने के लिए एक अच्छा समय बिताया। मैंने सोचा था कि मैं किसी तरह अपनी क्लासपाथ को गलत तरीके से सेट कर रहा था लेकिन समस्या यह थी कि मैंने टाइप किया था:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

के बजाय:

java -cp C:/java/MyClasses utilities/myapp/Cool   

मुझे लगा कि पूर्ण पैकेज नाम के बजाय पूर्ण पथ नाम को शामिल करने का मतलब पूरी तरह से योग्य है।


मैंने उस भ्रम को दूर करने के लिए अपना उत्तर अपडेट कर दिया है।
स्टीफन सी।

2
इनमें से कोई भी सही नहीं है। वर्ग को utilities.myapp.Coolअपने पैकेज के नाम के रूप में या यदि कोई हो, दिया जाना चाहिए ।
user207421

5

पहले इस कमांड का उपयोग करके पथ सेट करें;

set path="paste the set path address"

फिर आपको प्रोग्राम लोड करने की आवश्यकता है। संग्रहीत ड्राइव में "सीडी (फ़ोल्डर का नाम)" टाइप करें और इसे संकलित करें। उदाहरण के लिए, यदि मेरा प्रोग्राम डी ड्राइव पर संग्रहीत है, तो "D:" एंटर दबाएं और "cd (फ़ोल्डर का नाम)" टाइप करें।


4
यह मदद नहीं करता है। यह प्रश्न जावा प्रोग्राम के बारे में है, न कि सामान्य निष्पादन योग्य। जावा कुछ भी खोजने के लिए PATH का उपयोग नहीं करता है, और यदि "cd" मदद करता है तो यह निर्णय के बजाय भाग्य से होता है।
स्टीफन C

if "cd" helps then it by luck rather than by judgement। यह गलत है (मेरा मानना ​​है), क्योंकि जावा .डिफ़ॉल्ट रूप से क्लासपाथ के हिस्से के रूप में वर्तमान निर्देशिका का उपयोग करता है ।
GKFX

2
@GKFX - यही मेरा मतलब है। जब तक आप यह नहीं जानते हैं कि आप डिफ़ॉल्ट क्लासपाथ (या "।" उस पर ") का उपयोग कर रहे हैं," cd "का कोई प्रभाव नहीं पड़ेगा। यह समाधान भाग्य से अधिक काम करता है (अर्थात अनुमान लगा रहा है कि ""। "क्लासपाथ पर है) निर्णय की तुलना में (अर्थात" उस "।" क्लासपाथ पर है)। इसके अलावा आप डिफ़ॉल्ट के बारे में गलत हैं। जावा "का उपयोग करता है।" डिफ़ॉल्ट रूप से क्लासपाथ के रूप में, डिफ़ॉल्ट रूप से क्लासपाथ के हिस्से के रूप में नहीं।
स्टीफन C

5

मेरे मामले में समस्या क्या थी:

उस प्रोजेक्ट / वर्ग पर राइट क्लिक करें जिसे आप चलाना चाहते हैं, फिर Run As-> Run Configurations। फिर आपको अपने मौजूदा कॉन्फ़िगरेशन को ठीक करना चाहिए या निम्नलिखित तरीके से नया जोड़ना चाहिए:

Classpathटैब खोलें , Advanced...बटन पर क्लिक करें और फिर अपने प्रोजेक्ट का binफ़ोल्डर जोड़ें ।


5

यदि आप JAR फ़ाइल बनाने के लिए Maven का उपयोग करते हैं , तो कृपया pom.xml फ़ाइल में मुख्य वर्ग निर्दिष्ट करना सुनिश्चित करें:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

4

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

विंडोज (7 के साथ परीक्षण) विशेष वर्णों को स्वीकार नहीं करता है (जैसे) á ) वर्ग और पैकेज नामों में ) को । हालांकि लिनक्स करता है।

मुझे यह पता चला जब मैंने .jarनेटबीन्स में निर्माण किया और इसे कमांड लाइन में चलाने की कोशिश की। यह नेटबींस में चला लेकिन कमांड लाइन में नहीं।


4

.;शुरुआत में CLASSPATH मूल्य पर विंडोज पर डाल दिया ।

द। (डॉट) का अर्थ है "वर्तमान निर्देशिका में देखो"। यह एक स्थायी समाधान है।

इसके अलावा आप इसे "एक बार" सेट के साथ सेट कर सकते हैं CLASSPATH=%CLASSPATH%;.। यह तब तक चलेगा जब तक कि आपकी cmd विंडो ओपन नहीं हो जाती।


1
यह सलाह मदद कर सकती है या नहीं। यह मदद करेगा यदि क्लास ट्री जिसमें वर्तमान निर्देशिका में कक्षाएं हैं। अगर वे नहीं हैं तो यह नहीं होगा। मैं वास्तव में ऐसा नहीं करेगा। इसके बजाय मैं एक एक-लाइनर आवरण स्क्रिप्ट बनाऊंगा जो काम करता है कि क्या उपयोगकर्ता "सही" निर्देशिका में है या नहीं।
स्टीफन C

4

आपको वास्तव में srcफ़ोल्डर से ऐसा करने की आवश्यकता है । वहाँ आप निम्न कमांड लाइन टाइप करें:

[name of the package].[Class Name] [arguments]

मान लीजिए कि आपकी कक्षा को बुलाया जाता है CommandLine.class, और कोड इस तरह दिखता है:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

फिर आपको cdsrc फोल्डर में जाना चाहिए और आपको जिस कमांड को चलाने की आवश्यकता है वह इस तरह दिखाई देगा:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

और कमांड लाइन पर आउटपुट होगा:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

2
एक वर्ग को "कमांडलाइन.क्लास" नहीं कहा जा सकता है। यह एक जावा सिंटैक्स त्रुटि होगी। (आपका क्या मतलब है कि संकलित वर्ग वाली फ़ाइल को "कमांडलाइन.क्लास" ...) कहा जाता है। दूसरी समस्या यह है कि आपके निर्देश "cd to the source directory" केवल तभी काम करती है जब आपने कोड को संकलित किया है >> स्रोत निर्देशिका ट्री। अंत में, यदि आपके संकलन ने "-cp" तर्क का उपयोग किया है, तो जब आप चलते हैं तो आपको एक समकक्ष की आवश्यकता होती है।
स्टीफन सी

मेरी परियोजना में मेरे पास रूट पर src फ़ोल्डर और बिन फ़ोल्डर है। मुझे उसके लिए काम cdकरना था srcऔर फिर java ../bin com.blah.blah.MyClassमेरे लिए काम करना था। तो टिप के लिए धन्यवाद!
tamj0rd2

3

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

Error: main class not found or loaded

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

संदर्भ: https://www.computingnotes.net/java/error-main-class-not-found-or-loads/


1
क्या आपने स्वीकृत उत्तर पढ़ा है? क्या आपका जवाब कुछ नया जोड़ता है?
स्टीफन सी

1
@StephenC मैंने "कारण" श्रेणियों और उनके बिंदुओं को देखकर आपकी सूची में एक कारण खोजने की कोशिश की है। मुझे "कारण # 1" में मिलान बिंदु नहीं मिला और "कारण # 2" शीर्षक मेरे मामले के करीब नहीं लगा (क्योंकि मुझे यकीन था कि क्लासपाथ के साथ कोई समस्या नहीं है)। मैंने प्रयोगों को करने के कारण पाया है और मुझे आश्चर्य हुआ कि मेरे मामले में "मुख्य वर्ग नहीं मिला" त्रुटि दिखाई गई क्योंकि कार्यान्वयन इंटरफ़ेस वर्ग पथ पर नहीं था। निश्चित रूप से आप कह सकते हैं "आपको पोस्ट में वर्णित सब कुछ पढ़ना चाहिए" लेकिन यह मुझे लगता है कि आपकी कारण सूची में सुधार किया जा सकता है।
गमकिंस

3

Windows PowerShell में विज्ञापित विकल्प के javaसाथ चलने पर -cpआपको एक त्रुटि मिल सकती है जो कुछ इस तरह दिखाई देती है:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

आदेश को स्वीकार करने के लिए PowerShell के लिए, -cpविकल्प के तर्कों को उद्धरण में शामिल किया जाना चाहिए:

java -cp 'someDependency.jar;.' ClassName

इस तरह से कमांड बनाने से जावा को क्लासपैथ तर्कों को सही तरीके से प्रोसेस करने की अनुमति मिलनी चाहिए।


3

Java MongoDB JDBC कनेक्शन का परीक्षण करते समय मुझे भी इसी तरह की त्रुटियों का सामना करना पड़ा। मुझे लगता है कि संक्षेप में अपने अंतिम समाधान को संक्षेप में प्रस्तुत करना अच्छा है ताकि भविष्य में कोई भी सीधे दो आज्ञाओं पर गौर कर सके और आगे बढ़ना अच्छा हो।

मान लें कि आप उस निर्देशिका में हैं जहां आपकी जावा फ़ाइल और बाहरी निर्भरता (JAR फाइलें) मौजूद हैं।

संकलित करें:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -सीपी - क्लासपाथ तर्क; एक-एक करके सभी निर्भर JAR फ़ाइलों को पास करें
  • * .java - यह जावा क्लास की फाइल है जिसमें मुख्य विधि है। sdsd

Daud:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • कृपया सभी निर्भरता JAR फ़ाइलों के समाप्त होने के बाद बृहदान्त्र (यूनिक्स) / अल्पविराम (विंडोज) का निरीक्षण करें
  • अंत में, बिना विस्तार के मुख्य वर्ग के नाम का अवलोकन करें (कोई .class या .java)

यह सब मानता है कि 1) JavaMongoDBConnectionका कोई पैकेज नहीं है, और 2) आप निर्देशिका नहीं बदलते हैं। यह कहना है, कम से कम, नाजुक। और मुद्दों की व्याख्या न करके, यह उन परिस्थितियों में इस दृष्टिकोण की कोशिश करने के लिए newbies का नेतृत्व करेगा जहां यह काम नहीं करेगा । संक्षेप में, यह "वूडू प्रोग्रामिंग तकनीकों" को प्रोत्साहित करता है: en.wikipedia.org/wiki/Voodoo_programming
स्टीफन C

3

ठीक है, पहले से ही कई जवाब हैं, लेकिन किसी ने भी उस मामले का उल्लेख नहीं किया जहां फ़ाइल की अनुमति अपराधी हो सकती है।

चलाते समय, उपयोगकर्ता के पास JAR फ़ाइल या पथ के किसी एक निर्देशिका तक पहुँच नहीं हो सकती है। उदाहरण के लिए, विचार करें:

जार फ़ाइल में /dir1/dir2/dir3/myjar.jar

उपयोगकर्ता 1 जो JAR फ़ाइल का मालिक है:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

लेकिन यह अभी भी काम नहीं करता है:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

ऐसा इसलिए है क्योंकि चल रहे उपयोगकर्ता (User2) की पहुंच dir1, dir2, या javalibs याir3 तक नहीं है। जब उपयोगकर्ता 1 फ़ाइलों को देख सकता है, तो वह किसी नट को ड्राइव कर सकता है, और उन तक पहुंच सकता है, लेकिन त्रुटि अभी भी उपयोगकर्ता 2 के लिए होती है।


2

mvn eclipse:eclipse यह करने के बाद मुझे यह त्रुटि मिली, इसने मेरी .classpathफ़ाइल को थोड़ा गड़बड़ कर दिया ।

में लाइनों बदलना पड़ा .classpathसे

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

सेवा

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />

2

मैं यहां बताए गए समाधानों के साथ इस समस्या को हल करने में असमर्थ था (हालांकि उत्तर में कहा गया है, कोई संदेह नहीं है, मेरी अवधारणाओं को साफ कर दिया है)। मुझे दो बार इस समस्या का सामना करना पड़ा और हर बार मैंने अलग-अलग समाधान (ग्रहण आईडीई में) की कोशिश की।

  • सबसे पहले, मैं mainअपनी परियोजना के विभिन्न वर्गों में कई तरीकों के साथ आया हूं। इसलिए, मैंने mainबाद की कक्षाओं से विधि को हटा दिया था ।
  • दूसरे, मैंने निम्नलिखित समाधान की कोशिश की:
    1. मेरी मुख्य परियोजना निर्देशिका पर राइट क्लिक करें।
    2. हेड टू सोर्स और फिर डिफॉल्ट सेटिंग्स और फिनिश पर स्टिक। कुछ पृष्ठभूमि कार्यों के बाद आपको अपनी मुख्य परियोजना निर्देशिका में निर्देशित किया जाएगा।
    3. उसके बाद मैंने अपनी परियोजना को बंद कर दिया, इसे फिर से खोल दिया, और बूम किया, आखिरकार मैंने अपनी समस्या हल कर ली।

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